2015-01-15 2 views
0

두 가지리스트 (별도 클래스)를 완전히 조인하려고합니다. 내가 이런 식으로해야하는 이유는 모든 주문이 필요하기 때문입니다 내 시스템에서 다른 시스템의 주문과 함께 일부 주문은 주문 번호와 일치하고 일부 주문은 일치하지 않습니다.하지만 여전히 모든 주문을 그리드에 표시하고 싶습니다.전체 외부 조인은 세 번째 클래스의 세 번째 목록으로 분리 된 클래스의 두리스트를 합친 것입니다.

두 인터페이스는 끝나게한다 HESE 두 개의 인터페이스의 조인이

 interface IOrderInternal 
    { 
      int ID { get; } // My systems inernal ID 
      string NO_Order { get; } // My external ID 
      DateTime? OrderDate { get; } 
    } 

    interface IOrderExternal 
    { 
      int ID { get; } // External systems internal ID 
      string ProjectNumber{ get; } 
    } 

같이

그래서 두 개의 목록이 완전 외부 그들에 가입해야하는 함수에 전달됩니다
 interface IOrderInternal 
    { 
      int ID_IN { get; set; } 
      int ID_EX { get; set; } 
      string ProjectNumber{ get; set; } 
      DateTime OrderDate { get; set; } 
    } 

, 내가 가입하면 NO_Order = ProjectNumber

 IList<IOrderInternal> INOrders 
    IList<IOrderExternal> EXOrders 

    var leftJoin = from exorder in EXOrders 
        join inorder in INOrders 
         on exorder.ProjectNumber equals inorder.NO_Order 
        into temp 
        from inorder in temp 
        select new Order 
        { 
         ID_IN = inorder == null ? default(int) : inorder.ID, 
         ID_EX = exorder.ID, 
         ProjectNumber = inorder == null ? default(string) : inorder.NO_Order 
         OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate 
        }; 

    var rightJoin = from inorderin INOrders 
        join exorderin EXOrders 
         on inorder.NO_Order equals exorder.ProjectNumber 
        into temp 
        from exorder in temp 
        select new Order 
        { 
         ID_IN = inorder.ID, 
         ID_EX = exorder == null? default(int) : exorder.ID, 
         ProjectNumber = inorder.NO_Order 
         OrderDate = inorder.OrderDate 
        }; 

    var joinedList = leftJoin.Union(rightJoin); 

에 따라 목록 I에만 GE 내부 조인의 결과. 하지만 나는 모든 명령을 모두 알아야합니다.

어떤 도움을 어느 방향으로 조인

+0

여러분의 인터페이스의 정의에서'IOrderInternal' 대신에'IOrderExternal'을 명명해야한다고 생각합니다. 그리고 조인 된 인터페이스는 다른 이름을 가져야합니다. – juharr

+0

고마워, 지금 편집 해! – Alex

답변

0

내가 제대로 이해하면, 당신은 외부 싶지 :) 감사하고 함께 결과를 연결할있다? 내가 왼쪽 LINQ에서 조인 어떻게이다 : 그것은 왼쪽이 모두 한 줄에 가입 유지하기 때문에

IList<IOrderInternal> INOrders 
IList<IOrderExternal> EXOrders 

var leftJoin = from exorder in EXOrders 
       from inorder in INOrders.Where(x => exorder.ProjectNumber == x.NO_Order).DefaultIfEmpty() 
       select new Order 
       { 
        ID_IN = inorder == null ? default(int) : inorder.ID, 
        ID_EX = exorder.ID, 
        ProjectNumber = inorder == null ? default(string) : inorder.NO_Order 
        OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate 
       }; 

var rightJoin = from inorderin INOrders 
       from exorderin EXOrders.Where(x => inorder.NO_Order == x.ProjectNumber).DefaultIfEmpty() 
       select new Order 
       { 
        ID_IN = inorder.ID, 
        ID_EX = exorder == null? default(int) : exorder.ID, 
        ProjectNumber = inorder.NO_Order 
        OrderDate = inorder.OrderDate 
       }; 

var joinedList = leftJoin.Union(rightJoin); 

나는이 방법을 좋아하지만, 당신이 당신의 구문을 계속 사용하기를 원한다면, 당신은 변경해야 할 것 같아 각 쿼리에서 temp ~ temp.DefaultIfEmpty()을 사용하십시오.

+0

신난다, 고마워! 나는 매력처럼 작동하는 것 같지만 데이터를 완전히 확인하지는 못했지만 카운터는 정확 해 보입니다! 다시 한번 감사드립니다 :) – Alex