【问题标题】:Entity Framework Core JOIN with method syntax带有方法语法的 Entity Framework Core JOIN
【发布时间】:2022-01-13 19:17:51
【问题描述】:

我有一个简单的数据库结构如下

订购

订单编号

订单项

OrderItemId |订单号 |书名 | OrderItemTypeId

图书

BookId |作者ID

我想选择一个特定的订单以及与其关联的所有数据,即 OrderItems 以及所售图书的作者。

context.Orders.Include(order => order.OrderItems)
                 .ThenInclude(orderItem => orderItem.Book)
                 .ThenInclude(book => book.Author)
              .Include(order => order.OrderItems)
                 .ThenInclude(orderItem => orderItem.OrderItemType)
              .Where(order => order.Id == 1); 

我卡住的地方是在这条线之后

 .ThenInclude(book => book.Author)

因为 lambda 现在将引用一本书,但我需要回到 OrderItem 级别以包含 OrderItemType。我似乎能够做到这一点的唯一方法是再次包含 OrderItems 以获得包含 OrderItemType 的访问权限。这似乎不正确或至少不是很优雅。有人可以指出我使用方法语法的更好方法的方向。谢谢

【问题讨论】:

  • 请注意,Include 不是 JOIN,它是加载相关实体的指令。它应该如何实施决定了 EF 团队。是的,通常是 JOIN。

标签: entity-framework-core linq-method-syntax


【解决方案1】:

其实你的代码是正确的。 Include 从根实体重新定义包含,在您的情况下为 context.Orders

您可以在此处改进:仅包括非收藏项,它们可以通过完整路径定义:

context.Orders
    .Include(order => order.OrderItems)
        .ThenInclude(orderItem => orderItem.Book.Author)
    .Include(order => order.OrderItems)
        .ThenInclude(orderItem => orderItem.OrderItemType)
    .Where(order => order.Id == 1); 

ThenInclude(orderItem => orderItem.Book.Author) 将包括书籍和作者。

【讨论】:

  • 欣赏两位 cmets Svyatoslav。两用。谢谢。
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 2017-03-24
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多