代码之家  ›  专栏  ›  技术社区  ›  Bastien Vandamme

级联GroupJoin

  •  1
  • Bastien Vandamme  · 技术社区  · 8 年前

    假设我们有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 回复  |  直到 8 年前
        1
  •  1
  •   Nkosi    8 年前

    第二个 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
                })
        });