2017-12-30 59 views
1

Orders, OrderItems 및 OrderSubItems 테이블이 3 개 있다고 가정 해 보겠습니다. 자체 주문 하위 항목을 포함하는 주문 항목을 포함하는 주문 테이블. 계단식 그룹 조인

그래서

Orders: 
Id  | Other columns 
O-123456 | 
O-789123 | 
O-456789 | 

OrderItems: 
Id  | OrderId | Other columns 
OI-123456 | O-123456 | 
OI-123457 | O-123456 | 
OI-123458 | O-123456 | 
OI-123459 | O-456789 | 
OI-123460 | O-456789 | 
OI-123461 | O-456789 | 

OrderSubItems: 
Id   | OrderItemId | Other columns 
OSI-123456 | OI-123456 | 
OSI-123457 | OI-123456 | 
OSI-123458 | OI-123457 | 
OSI-123459 | OI-123457 | 
OSI-123460 | OI-123458 | 
OSI-123461 | OI-123458 | 

따라서 순서 O-123456 3 주문 상품 OI-123456를 갖고, OI-123,457 및 123,458-OI. 각 주문 항목에는 2 개의 주문 하위 항목이 있습니다.

저는 엔티티 프레임 워크 데이터베이스를 먼저 사용하고 제약 조건을 사용하지 않고이 세 테이블간에 링크를 만듭니다. 그래서 수동으로 링크를 만들어야합니다. 두 번째 GroupJoin 컴파일되지

Orders.GroupJoin(OrderItems, order => order.Id, orderItem => orderItem.OrderId, (order, orderItem) => new { order, orderItem }) 
     .GroupJoin(OrderSubItems, x => x.orderItem.Id, y => y.OrderItemId, (x, orderSubItem) => new 
     { 
      x.orderItem.ItemId, 
      ... ??? 
     }) 
     .Dump(); 

:

이미 이런 짓을. 내 목표는 데이터의 원래 구조를 만드는 것입니다. 나는 LinqPad를 사용한다.

답변

1

두 번째 GroupJoin은 첫 번째 GroupJoin 결과에서 호출하고 익명 항목의 컬렉션에서는 첫 번째로 생성되지 않기 때문에 컴파일되지 않습니다. 원하는 개체 유형

var result = Orders.GroupJoin(OrderItems, 
    order => order.Id, 
    orderItem => orderItem.OrderId, 
    (order, orderItems) => new { 
     OrderId = order.Id, 
     //...other properties 
     OrderItems = orderItems.GroupJoin(OrderSubItems, 
      orderItem => orderItem.Id, 
      subItem => subItem.OrderItemId, 
      (item, subItems) => new { 
       ItemId = item.Id, 
       //...other properties 
       SubItems = subItems 
      }) 
    }); 
을 정의 할 때 혼동을 피하기 도움이 될 쿼리를 포맷