【问题标题】:Eager Load many to Many - EF Core [closed]渴望加载多对多 - EF Core [关闭]
【发布时间】: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] 属性。

标签: c# entity-framework lambda asp.net-core


【解决方案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 之前我完全错过了这一点。
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2014-11-29
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多