【发布时间】:2015-04-21 18:31:53
【问题描述】:
我有一个运行良好的 Linq 语句,只是我只想返回具有特定值的项目。当我在 .any() 中添加一个子句时,它会冻结我的浏览器。有没有更好的方法来做到这一点,或者优化它?
让我向您展示两个版本。一个工作得很快,另一个永远加载。两者的区别在于.where()的第一行
工作版本:
var creat = (db.Creatures
.Include("UserTypes")
.Include("UserTypes.Carts")
.Include("UserTypes.Carts.Items")
.Include("UserTypes.Carts.Items.Details")
.Where(b => b.UserTypes.Any(c => c.Carts.Any(tb => tb.Status == "Paid"))
&& b.UserTypes.Any(c => c.Carts.Any(cb => cb.Items.Any()))
&& b.UserTypes.Any(c => c.UserTypeID== UserTypeGUID))).Take(10);
我想做什么但没有工作。它永远加载:
var creat = (db.Creatures
.Include("UserTypes")
.Include("UserTypes.Carts")
.Include("UserTypes.Carts.Items")
.Include("UserTypes.Carts.Items.Details")
.Where(b => b.UserTypes.Any(c => c.Carts.Any())
&& b.UserTypes.Any(c => c.Carts.Any(cb => cb.Items.Any()))
&& b.UserTypes.Any(c => c.UserTypeID== UserTypeGUID))).Take(10);
【问题讨论】:
-
做类似
c.Bookings.Where(tb => tb.Status == "Paid") -
您是否检查过服务器端代码是否有效?根据您提供给我们的信息,您很可能在
tb.Status上使用新过滤器得到 0 个结果,而您的客户端代码无法处理它。 -
可能是一个糟糕的查询计划,或者只是一个需要处理的异常查询。捕获实际的执行计划(可能使用 SQL Profiler 和 XML Showplan 事件)并以某种方式发布。查询一开始就会引发该事件,因此您可以在此之后终止它。