2 개의 DataTable이 있습니다. OriginalEntity 및 엔터티 인터페이스 응용 프로그램이 Entity DataTable의 행을 수정합니다. 저장하는 동안 수정되었거나 OrigianlEntity와 다른 DataRow를 확인하려고합니다. 예를 들어 비교하는 동안 몇 개의 입력란을 제외해야합니다. 수정 된 날짜 및 기타 감사 필드. 현재 나는이 같은 데이터 테이블의 각 행을 반복하고있다 :일부 열을 제외하고 2 개의 DataRow를 비교하십시오.
List<string> auditFields = new List<string>(){"createdon","modifiedon"};
string IdentityKeyName = "id";
object ent,orgEnt;
foreach(string columnName in columnList) // ColumnList is List of columns available in datatable
{
foreach(DataRow dr in Entity.Rows)
{
ent = dr[columnName];
orgEnt = OriginalEntity.Select(IdentityKeyName + " = " + dr[IdentityKeyName].ToString())[0][columnName];
if(!ent.Equals(orgEnt) && !auditFields.Contains(columnName))
{
isModified = true;
break;
}
}
}
난 그냥 효율적인 방법은 위 달성하고자합니다. 제발 제안 해주세요.
감사합니다 귀하의 제안에 대한 모든 사람, 이것은 내 (I은 기본 키가 정의하지 않는 한)
해결 방법 : 열이 비교하지만 루프해야 할 것
public bool isModified(DataTable dt1, DataTable dt2, string IdentityKeyName)
{
bool isModified = false;
List<string> auditFields = new List<string>() { "createdon", "modifiedon" };
isModified = isModified || (dt1.Rows.Count != dt2.Rows.Count);
if(!isModified)
{
//Approach takes 150 ms to compare two datatable of 10000 rows and 24 columns each
DataTable copyOriginalEntity = dt1.Copy();
DataTable copyEntity = dt2.Copy();
//Exclude field you don't want in your comparison -- It was my main task
foreach(string column in auditFields)
{
copyOriginalEntity.Columns.Remove(column);
copyEntity.Columns.Remove(column);
}
for(int i=0;i<copyOriginalEntity.Rows.Count;i++)
{
var origItems = copyOriginalEntity.Rows[i].ItemArray;
var entityItem = copyEntity.Select(IdentityKeyName + " = " + copyOriginalEntity.Rows[i][dentityKeyName].ToString())[0].ItemArray;
if(string.Concat(origItems) != string.Concat(entityItem)){ isModified = true; break; }
}
}
return isModified;
}
무엇이'columnName'입니까? 결국 원하는 결과는 무엇입니까? 변경된 사항이 있는지 또는 행과 필드를 알고 싶나요? –
'효율적인'이란 무엇을 의미합니까? 더 빠르고, 적은 코드, 또는 다른 것들? – qxg
@TimSchmelter, 수정 된 코드. –