2012-08-01 2 views
1

에 존재하지 않는 어떤 하나 개의 테이블에서 선택,이C#을 Linq에이 - 예를 들어 다른

데이터 테이블 1

COLA | COLB | COLC 
1  123  321 
2  321  333 
3  222  232 

데이터 테이블이

COLA | COLB | COLC 
1  123  321 
2  321  333 
과 같이 두 개의 테이블이

표 1에서 행 3 만 선택하려고합니다.

나는 콜라 ID에 함께 두 개의 테이블을 조인 할 수 있도록하려면,하지만 단지 내가 LINQ에서이 작업을 수행 할 수 있습니다 어떻게 데이터 테이블 2.

에 존재 노토 할 데이터 테이블 1에서 행을 선택?

결과를 데이터 테이블 또는 Ienumerable 또는 데이터 테이블로 다시 변경하기 쉬운 것으로 강력히 선호합니다. 가능하지 않다면 내가 관리 할거야.

답변

7
var rows = from t1 in table1.AsEnumerable() 
      join t2 in table2.AsEnumerable() 
       on t1.Field<int>("COLA") equals t2.Field<int>("COLA") into tg 
      from tcheck in tg.DefaultIfEmpty() 
      where tcheck == null 
      select t1 

이 궁극적으로 왼쪽 외부 조인을 수행하고, null 인 table2에서 모든 행은 table1의 기록이 일치하지 않는 것을 의미한다. 나는 table1에있는 모든 행에 대해 table2을 열거 할 수 있으므로 Any 메서드를 사용하지 않는 것이 좋습니다 (더 큰 세트의 경우 이것이 좋지 않습니다). LINQ 조인은 지정한 선택기 함수에 대해 일치하는 쌍을 찾으려면 두 테이블을 한 번만 열거합니다.

+0

방금 ​​시도하고 "지정된 캐스트 유효하지 않습니다." 내 결과로. 무엇이 잘못되었는지 확신하지 못합니다. 어떤 아이디어? – Kyle

+0

열 중 하나가 int로 지정되지 않았습니다. 'table1.Columns [ "COLA"] .DataType'과'table2.Columns [ "COLA"] .DataType'이 반환하는 것을보십시오. 그 중 하나가 정수 필드가 아닌 다른 것으로 설정되어 있다고 확신합니다 (이 경우 ''을 필요한 데이터 형식으로 변경하고 가능하면 형 변환해야합니다). – SPFiredrake

+0

나는 둘 다 int임을 확신했지만, 하나는 Int64이고 다른 하나는 Int32입니다. 내가 Int64로 제어 할 수있는 하나를 변경하고 으로 변경했는데 이제 'DBNull.Value를'System.Int64 '를 입력 할 수 없습니다.'라는 오류가 발생합니다. nullable 타입을 사용하십시오. ' 컬럼을 Int64로 만들려고 했습니까? 그러나 데이터 테이블은 그것을 지원하지 않습니다 – Kyle

3

가장 간단한 방법은 다음과 같습니다

var dt2Cola = new HashSet<int>(table2.AsEnumerable() 
            .Select(x => x.Field<int>("COLA")); 

var dt1Rows = table1.AsEnumerable() 
        .Where(x => !dt2Cola.Contains(x.Field<int>("COLA")); 
+0

"지정된 캐스트가 유효하지 않습니다." 예외를 시도 할 때 – Kyle