级联集团加入

时间:2017-12-30 02:32:24

标签: c# linq

假设我们有3个表:Orders,OrderItems和OrderSubItems。订单表,其中包含包含订单子项的订单商品。

所以

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个表之间创建链接。所以我需要手动创建链接。

我已经这样做了:

    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();

第二个GroupJoin没有编译。我的目标是创建原始数据结构。我使用LinqPad。

1 个答案:

答案 0 :(得分: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
            })
    });