잘 나는 두 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이
처럼 보이는이 나의 목표 나의 경우
결과 세트처럼 보이는 방법 방법이다 empIds 1,6,7 등과 같은 emp 레코드가 포함되어야합니다. 주 1 (성)이 다르며 2,3,4,5가 대상 DataTable에 포함되어 있습니다.
스크린 캐스트는 내 문제를 표시합니다 :
https://www.dropbox.com/s/145ba6oa59fstdc/screencap.wmv
나는 그것이 어려운이