实体框架中的FK对象 - 性能问题

时间:2015-11-01 21:23:19

标签: entity-framework c#-4.0

我正在使用Entity Framework并且很新。

我有一个名为:Order和table的表:Products。

每个订单都有很多产品。

在生成实体时,我将带有ICollection的Order对象发送到产品。

问题是我每个订单都有很多产品(20K)和我做的时候

order.Products.where(......)

EF仅使用orderId = 123运行select语句,并执行代码中其余部分。

因为我有很多结果 - 选择需要花费很多时间。如何更改代码 - 数据库中的选择将与where条件一致?

1 个答案:

答案 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查询。