2017-12-30 63 views
1

Orders、OrderItems、OrderSubItemsの3つのテーブルがあるとします。注文サブ項目を含むオーダー項目を含むオーダーの表。カスケードGroupJoin

だから

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-123457及びOI-123458を有しています。これらのオーダーアイテムのそれぞれには、2つのオーダーのサブアイテムがあります。

私はエンティティフレームワークのデータベースを最初に使用していますが、制約はありません。これらの3つのテーブルの間にリンクが作成されています。だから私はリンクを手動で作成する必要があります。二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

第2の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 
      }) 
    }); 
を定義する際の混乱を避けるために役立つだろう