2011-10-22 3 views
10

두 테이블, Table1Table2 있습니다.LINQ에서 JOIN 후 모든 열 선택

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

알 수 있듯이 결과 테이블에서 두 개체의 모든 속성을 선택하려고합니다. 결합하는 동안 고려되는 열거 형은 특정 형식의 개체를 포함합니다 -이 두 가지 관계에 대해 다릅니다.) 물론 예제에서와 같이 익명 select에서 속성을 선택할 수 있습니다.

내 질문에 수동으로 모든 속성을 지정하는 것을 피하는 방법은 무엇입니까? 나는 SELECT * FROM TABLE3과 같은 것을 가지고 싶습니다. TABLE3TABLE1TABLE2에 합류 한 후 결과 관계가되는 곳입니다.

미리 감사드립니다.

답변

10

평평한 유형으로 투영하려면 수동으로 각각 지정해야합니다. 다른 옵션은 결합 된 유형에 두 객체를 모두 포함시키는 것입니다. 객체는 자연스럽게 속성을 가져옵니다.

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

그리고 당신은 myObj.Object1.Property1, myObj.Object2.Property4처럼 작동 것 등

여전히 수작업을 포함 한 마지막 옵션은 적절한 유형을 정의하고 생성자 또는을하는 빌더 방법을 가지고있다

개체 속성을 병합 된 형식으로 세분화하는 작업. 여전히 수동 매핑을 수행하지만이를 쿼리 로직과 분리합니다.

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

첫 번째 옵션은 할당 중에 ToString() 메서드를 사용하지 않습니까? 이 경우 myOutput.ToArray()를 수행 한 후 Object1이라는 열에서 인스턴스 "Namespace.MyType"값을 가져옵니다 ... – Jamie

+0

아니요, ToString()을 호출하지 않을 것입니다. ? 당신은 그것을 어떤 종류의 UI 컨트롤에 바인딩하고 있습니까? * control *은'ToString()'을 호출 할 수도 있지만, 쿼리 자체는 본질적으로 전체 객체를 사용하고 속성에 매핑합니다. –

+0

귀하의 의견은 나에게 아이디어를주었습니다. 두 객체에 대한 참조가 포함 된 새로운 클래스를 만들었습니다. 그렇다면 이들의 특정 속성에 바인딩하기 쉽습니다 :) – Jamie