我正在使用Entity Framework并且很新。
我有一个名为:Order和table的表:Products。
每个订单都有很多产品。
在生成实体时,我将带有ICollection的Order对象发送到产品。
问题是我每个订单都有很多产品(20K)和我做的时候
order.Products.where(......)
EF仅使用orderId = 123运行select语句,并执行代码中其余部分。
因为我有很多结果 - 选择需要花费很多时间。如何更改代码 - 数据库中的选择将与where条件一致?
答案 0 :(得分:1)
本声明:
var prods = order.Products.Where(...);
相当于:
var temps = order.Products;
var prods = temps.Where(...);
与返回Where(...)
的{{1}}不同,IQueryable
触发延迟加载,产生order.Products
并将立即执行,而不是延迟。因此,这个ICollection
部分会生成您看到的select语句。它将属于该订单的所有产品提取到内存中。然后order.Products
部分在内存中执行,因此表现不佳。
为避免这种情况,只有在您确实需要订单中的所有产品时才应使用Where(...)
。如果您只想要它们的一部分,请执行以下操作:
order.Products
请注意,ctx.Products.Where(prod => prod.Order.Id == order.Id && ...)
是数据库上下文,而不是ctx
对象。
如果您认为上面的order
条款看起来有点脏,那么这里的选择更为纯粹但更长:
prod.Order.Id == order.Id
生成完全相同的SQL查询。