【问题标题】:LINQ statment with .any() isnt returning. Loads forever带有 .any() 的 LINQ 语句未返回。永远加载
【发布时间】: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 事件)并以某种方式发布。查询一开始就会引发该事件,因此您可以在此之后终止它。

标签: c# linq


【解决方案1】:

我知道这并不能直接回答您的问题,但您的代码可以通过以下方式重构。您的三个条件涉及使用 Any 循环 UserTypes,您可以只使用一个。也不需要c.Carts.Any(),因为如果UserType 没有购物车,则第二个条件将失败。
正如@usr 的评论所建议的那样,复杂的查询可能被转换为一些复杂的sql。

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(cb => cb.Items.Any()) &&   
                                 c.UserTypeID == UserTypeGUID))).Take(10);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多