2014-06-06 1 views
1

저는 C#과 Linq에 익숙하지 않아 일치하는 값에 대해 두 개의 테이블을 쿼리하는 데 어려움을 겪고 있습니다.linq 및 C# 값을 일치시키는 두 테이블을 쿼리하는 방법?

저는 인턴으로 일하면서 Unit of Work Repository Pattern을 사용합니다. 예를 들어, SQL 테이블을 쿼리하려면이 linq 식을 사용합니다 : _entities.Atable.Where(x => x.Col1 == col1 && x.Col2 == col2). _entities 변수는 데이터베이스 모델의 모든 테이블 인터페이스를 나타냅니다.

두 테이블이 있다고 가정하십시오. Table1Table2.

Table1: Col1, Col2, colA, ColB 
Table2: Col1, col2, ColC, ColD 

여기 내가하고 싶은 내용은 다음과 같습니다 : COL1과 Col2의 두 변수 COL1과 COL2을 일치하여

  • 쿼리 Table1 다음은 각 테이블의 컬럼입니다.

    예를 들어, 다음 List1 = _entities.Table1.Where(x => x.Col1 == col1 && x.Col2 == col2).ToList()

  • , 모든 레코드에 대한 쿼리 Table2Table2.Col1Table2.Col2 일치 List1.Col1List1.Col2. 이 결과는 List2 목록에 저장할 수도 있습니다.

    예, 그런

  • List2 = _entities.Table2.Where(x => x.Col1 == List1.Col1 && x.Col2 == List1.Col2).ToList()가, 세 번째 목록, List3을, 즉 결국 Table2

에서 일치하는 항목이 없습니다 Table1에서 모든 항목을 포함, 나는이 싶습니다 표 1과 일치하는 Table2의 목록은 Col1Col2입니다. Table2에 일치 항목이없는 나머지 항목 Table1의 목록입니다.

대개 나는 세 번째 글 머리 기호에 머물러 있지만, 어떤 제안이나 개선이든 열려 있습니다.

마지막으로 이것이 가능한지 모르겠다. 두 목록을 하나로 결합하고 싶습니다. 그들은 다른 유형이기 때문에 이것이 어떻게 작동하는지 잘 모르겠습니다.

나는 이것이 모두 의미가 있기를 바랍니다. 나는 잠시 동안 내 머리를 감싸려고 노력했지만, 나는 여전히 쿼리를 만드는 방법에 난처한 입장이다. 나도 Except()Intersect()와 놀고 그러나 다량 운이 없었다.

도움을 주시면 감사하겠습니다.

+0

'예외()'대신 '차이()'를 시도해보십시오. – Monkpit

+0

좋아, 나는 그것을 조사하기 시작할 것이다. 감사. – navig8tr

+0

왼쪽 내부 결합을 시도하고 있습니까? –

답변

2

일반적으로 Any은 다른 유형의 여러 값을 일치시키는 가장 명확한 방법입니다.

class Type1 
{ 
    public int Key1 { get; set; } 
    public int Key2 { get; set; } 
    public string Type1Prop { get; set; } 
    public Type1(int key1, int key2, string prop) 
    { 
     Key1 = key1; 
     Key2 = key2; 
     Type1Prop = prop; 
    } 
} 

class Type2 
{ 
    public int Key1 { get; set; } 
    public int Key2 { get; set; } 
    public string Type2Prop { get; set; } 
    public Type2(int key1, int key2, string prop) 
    { 
     Key1 = key1; 
     Key2 = key2; 
     Type2Prop = prop; 
    } 
} 

public void Main() 
{ 
    var list1 = new List<Type1> 
    { 
     new Type1(1,1,"Value"), new Type1(1,2,"Value"), new Type1(2,1,"Value"), new Type1(2,2,"Value") 
    }; 
    var list2 = new List<Type2> 
    { 
     new Type2(1,1,"Value"), new Type2(2,1,"Value"), new Type2(3,1,"Value") 
    }; 
    var in1ButNot2 = list1.Where(item => !list2.Any(item2 => item2.Key1 == item.Key1 && item2.Key2 == item.Key2)).ToList(); 
    var in2ButNot1 = list2.Where(item => !list1.Any(item2 => item2.Key1 == item.Key1 && item2.Key2 == item.Key2)).ToList(); 
    var in1And2 = list2.Where(item => list1.Any(item2 => item2.Key1 == item.Key1 && item2.Key2 == item.Key2)).ToList(); 
    in1ButNot2.ForEach(item => Console.WriteLine("in1ButNot2 - Key1={0},Key2={1}", item.Key1, item.Key2)); 
    in2ButNot1.ForEach(item => Console.WriteLine("in2ButNot1 - Key1={0},Key2={1}", item.Key1, item.Key2)); 
    in1And2.ForEach(item => Console.WriteLine("in1And2 - Key1={0},Key2={1}", item.Key1, item.Key2)); 
} 

이렇게하면 아래 출력이 끝나고 데이터를 교차 할 수있는 모든 방법이 표시됩니다. 목록을 결합하는 것은 키를 원하면 결합 된 목록을 작성하기 위해 변환하는 공통 유형을 작성할 수있는 경우 직접 알아야 할 것입니다.

in1ButNot2 - Key1=1,Key2=2 
in1ButNot2 - Key1=2,Key2=2 
in2ButNot1 - Key1=3,Key2=1 
in1And2 - Key1=1,Key2=1 
in1And2 - Key1=2,Key2=1 
+0

좋은 답변입니다! 정확히 내가 원하는 것. 고마워요! – navig8tr

관련 문제