假设我们有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。
答案 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
})
});