【问题标题】:Does Any() run the LINQ queryAny() 是否运行 LINQ 查询
【发布时间】:2015-05-05 13:47:23
【问题描述】:

如果我写一个查询,例如:

var query = (from a in this.Context.Addresses where a.Active select a.Name);

那这样说对吗

if(query.Any())
 return query.ToList();

return null;

注意查询没有FirstOrDefault()ToList(),所以我想知道.Any() 是否运行查询?

【问题讨论】:

  • 是的,确实如此。如果您在文档中没有找到 deferred 一词,则可以确定它会执行查询并立即返回结果。
  • 感谢@TimSchmelter
  • 如果查询返回结果,则可以安全地假设它已执行(否则您将如何收到结果)。
  • 因此,如果我对原始查询执行 .ToList() 并且不执行 Any() 检查,它是否也有助于提高性能?因为看起来像这样我们运行了两次?一个与 Any 和一个与 ToList ?
  • @Bohn 是的,调用Any 然后调用ToList 将运行两个不同的 SQL 查询。调用ToList 然后Any 只会执行一个SQL 查询。

标签: linq linq-to-entities


【解决方案1】:

是的 - 它必须返回,因为它必须返回 truefalse。如果不运行查询,它可能无法做到这一点。

如果你要有条件地返回ToList(),你最好写:

var list = query.ToList();
return list.Any() ? list : null;

...或者我实际上建议您只返回query.ToList()无论如何,因为编写使用空列表的代码比必须对 null 进行特殊处理要容易得多价值。

【讨论】:

  • 因此,如果我对原始查询执行 .ToList() 并且不执行 Any() 检查,它是否也有助于提高性能?因为看起来像这样我们运行了两次?一个与 Any 和一个与 ToList ? ——
  • @Bohn:这取决于结果查询是否被缓存,以及 LINQ 提供程序对 Any 所做的确切操作 - 但是是的,我希望它至少 可能 i> 帮助提高性能。
  • @Bohn - 是的 - 以Any 结尾的查询与以ToList 结尾的查询不同。 Any 可能会在 SQL 中转换为 EXISTS,而 ToList 将执行完整查询并返回所有记录。但是,在列表上调用Any 非常快(可能比 SQL 调用快得多)。所以调用ToList then Any 可能会更快。但是,我同意 Jon 的观点,标准做法是返回一个空集合而不是 null(在这种情况下,您不需要 Any 调用)。
  • 我支持返回一个空列表而不是null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多