渴望加载多对多 - 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 => orderProducts.Product)
重要提示: IntelliSense 完成可能会告诉您不能这样做,但您可以,只需进行真正的构建,它就会起作用
【讨论】:
感谢链接。如图所示,我已经更新了我的 DbContext,但是 ThenInclude 不允许我选择产品。? 使用 IList 而不是 ICollection 有什么不同吗?以为我在使用 EF 时在某处读过,应该始终使用集合?IList
或 ICollection
应该以相同的方式工作(至少在这种情况下)。究竟是什么问题?这是完整的example
ThenInclude()
应该有两种可能的方法:ThenInclude(Expression<Func<IList<T>>>, object>>)
和 ThenInclude(Expression<Func<T>>, object>>)
(注意一个是列表,另一个只是一个元素)example
上面的 1/22 @ 7:00 评论很重要 - 智能感知让您看起来无法执行 .ThenInclude(orderProduct => orderProduct.Product),但它处于第二个重载中。可能值得在答案中说明,因为在阅读 cmets 之前我完全错过了这一点。以上是关于渴望加载多对多 - EF Core [关闭]的主要内容,如果未能解决你的问题,请参考以下文章