2014-04-15 1 views
0
를 사용하여 DataTable의 비교를 수행하기 위해 가입

잘 나는 두 DataTables은 (LINQ 문 왼쪽 외부 Linq에

내 테이블의 구조는 EMP를가 고유 키 인이

EmpId -- FirstName -- LastName -- DOB 

같은 것입니다

를 사용하여 비교하는 것을 시도하고있다 integer of course)이고 DOB는 날짜이고, 나머지는 문자열입니다.

는 TargetTable 레코드 이하의 같은 번호가있을 수 있습니다

SourceTable 및 TargetTable

오는 두 DataTables가 있습니다. 이름, 성 또는 DOB에 대한 일부 값이 다를 수 있습니다.

나머지 원본 레코드를 가져 오지 않고 작동하는 왼쪽 외부 조인이없는 쿼리입니다.

var matched = from dtSource in sourceTable.AsEnumerable() 
        join dtTarget in targetTable.AsEnumerable() on dtSource.Field<int>("empid") equals dtTarget.Field<int>("empid") 

        where dtSource.Field<string>("firstname") != dtTarget.Field<string>("firstname") 
        || dtSource.Field<string>("lastname") != dtTarget.Field<string>("lastname") 
        || dtSource.Field<DateTime>("dob") != dtTarget.Field<DateTime>("dob") 
        select dtSource; 

왼쪽 외부 조인을 수행하여 대상 데이터 테이블에없는 나머지 레코드를 얻으려고합니다.

이 나는 ​​당연히 내가 잘못 나는 where 절에 dtTarget에 액세스하지 못할 것처럼이 컴파일 위선적 인 말투로하고있는 중이 야

var join = from dtSource in source 
       join dtTarget in target 
        on dtSource.Field<int>("EmpId") equals dtTarget.Field<int>("EmpId") 
       into outer 
       where 
       dtSource.Field<string>("firstname") != dtTarget.Field<string>("firstname") 
        || dtSource.Field<string>("lastname") != dtTarget.Field<string>("lastname") 
        || dtSource.Field<DateTime>("dob") != dtTarget.Field<DateTime>("dob") 

       from dtEmpSal in outer.DefaultIfEmpty() 

       select new 
       { 
        FirstName = dtSource.Field<string>("FirstName") == null ? "" : dtSource.Field<string>("FirstName"), 
        LastName = dtSource.Field<string>("LastName") == null ? "" : dtSource.Field<string>("LastName"), 
        DOB = dtSource.Field<DateTime>("dob") == null ? DateTime.Today : dtSource.Field<DateTime>("dob") 
       }; 

을하려고했던 것입니다. 나는 잘못된 것을하고 있으며, 무엇을 알지 못한다.

편집 :

이 내 소스의 DataTable이

Source

처럼 보이는이 나의 목표 나의 경우

Target

결과 세트처럼 보이는 방법 방법이다 empIds 1,6,7 등과 같은 emp 레코드가 포함되어야합니다. 주 1 (성)이 다르며 2,3,4,5가 대상 DataTable에 포함되어 있습니다.

스크린 캐스트는 내 문제를 표시합니다 :

https://www.dropbox.com/s/145ba6oa59fstdc/screencap.wmv

나는 그것이 어려운이

답변

0

이 나에게

public static dynamic GetAllDifferences (DataTable sourceTable,DataTable targetTable) 
     { 
      var source = sourceTable.AsEnumerable(); 
      var target = targetTable.AsEnumerable(); 

      var noMatchInSource = from dtSource in source 
       join dtTarget in target on dtSource.Field<int>("empid") equals dtTarget.Field<int>("empid") 
       where dtSource.Field<string>("firstname").Equals(dtTarget.Field<string>("firstname")) 
         && dtSource.Field<string>("lastname").Equals(dtTarget.Field<string>("lastname")) 
         && dtSource.Field<DateTime>("dob").Equals(dtTarget.Field<DateTime>("dob")) 
       select dtSource; 

      var result = 
         from sourceDataRow in sourceTable.AsEnumerable() 
         where !(from noMatchDataRow in noMatchInSource 
           select noMatchDataRow.Field<int>("empid")) 
           .Contains(sourceDataRow.Field<int>("empid")) 
         select sourceDataRow; 
           return result; 
     } 
도움이 무엇 :(디버깅을 발견하고