渴望加载多对多 - EF Core [关闭]

Posted

技术标签:

【中文标题】渴望加载多对多 - EF Core [关闭]【英文标题】:Eager Load many to Many - EF Core [closed] 【发布时间】:2017-06-06 20:30:51 【问题描述】:

您好,我有一个多对多关系,如下所示。

public class order

    public int id  get; set;     
    public virtual ICollection<OrderProducts> Products  get; set; 


public class product

    public int id  get; set; 
    public virtual ICollection<OrderProducts> Orders  get; set; 


public class OrderProducts

    public int OrderId  get; set; 
    public virtual Order Order get; set; 

    public int ProductIdId  get; set; 
    public virtual Product Product  get; set;    

我想将所有产品包含(急切加载)到他们的订单中,但是当使用与客户显示的相同方法时,我的产品列表会填充 OrderProducts-objects 而不是 Product-objects

public IEnumerable<Order> GetAll()

    return dataContext.Orders
                      .Include(order => order.Customer)
                      // now include all products aswell..

我试过没有运气之类的东西

  .Include(order => order.Products.Where(op => op.OrderId == order.Id).Select(p => p.Product))

如果有人可以在这里帮助我,我将不胜感激.. 也非常欢迎您分享有关如何构建更高级 lambda 的任何好的资源,因为我对此还不是很熟悉..

【问题讨论】:

为什么你的OrderProducts 班级只有一个Product?不是数组或列表 @S.Serp OrderProducts 是一个多对多关系表,因此它将单个订单链接到单个产品 只是为了澄清 - 罗宾一直都是对的。阅读此github.com/aspnet/EntityFramework/issues/6166 并进行一些调试后,对象一直都在那里。我只需要重新排列我的 [JsonIgnore] 属性。 【参考方案1】:

只需使用ThenInclude() 声明:

public class order

    public int id  get; set;     
    public virtual IList<OrderProducts> OrderProducts  get; set; 

//...
public IEnumerable<Order> GetAll()

    return dataContext.Orders
                      .Include(order => order.OrderProducts)
                      .ThenInclude(orderProducts => orderProducts.Product);

如here 所述,多对多关系尚未实现。你必须加载你的OrderProducts 然后Select(orderProducts =&gt; orderProducts.Product)

重要提示: IntelliSense 完成可能会告诉您不能这样做,但您可以,只需进行真正的构建,它就会起作用

【讨论】:

感谢链接。如图所示,我已经更新了我的 DbContext,但是 ThenInclude 不允许我选择产品。? 使用 IList 而不是 ICollection 有什么不同吗?以为我在使用 EF 时在某处读过,应该始终使用集合? IListICollection 应该以相同的方式工作(至少在这种情况下)。究竟是什么问题?这是完整的example ThenInclude() 应该有两种可能的方法:ThenInclude(Expression&lt;Func&lt;IList&lt;T&gt;&gt;&gt;, object&gt;&gt;)ThenInclude(Expression&lt;Func&lt;T&gt;&gt;, object&gt;&gt;)(注意一个是列表,另一个只是一个元素)example 上面的 1/22 @ 7:00 评论很重要 - 智能感知让您看起来无法执行 .ThenInclude(orderProduct => orderProduct.Product),但它处于第二个重载中。可能值得在答案中说明,因为在阅读 cmets 之前我完全错过了这一点。

以上是关于渴望加载多对多 - EF Core [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 渴望加载多对多,仅获取一条记录(不是集合)

渴望加载 Laravel 5 与两个外键的多对多关系

EF Core 多对多关系

EF Core 多对多关系上的 LINQ 查询

如何在 EF Core 中查询多对多关系

EF Core多对多查询加入3个表