是否有()运行LINQ查询

是否有()运行LINQ查询,linq,linq-to-entities,Linq,Linq To Entities,例如,如果我编写一个查询: var query = (from a in this.Context.Addresses where a.Active select a.Name); 那么这样说对吗 if(query.Any()) return query.ToList(); return null; 请注意,查询没有FirstOrDefault()或ToList(),因此我正在记录是否。是否有任何()运行查询 是-它必须返回,因为它必须返回true或false。如果不运行查询,它不可能做

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

var query = (from a in this.Context.Addresses where a.Active select a.Name);
那么这样说对吗

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

return null;

请注意,查询没有
FirstOrDefault()
ToList()
,因此我正在记录是否
。是否有任何()
运行查询

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

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

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

。。。或者我实际上建议您只返回
query.ToList()
,因为编写使用空列表的代码要比在特殊情况下使用空值容易得多。

是的,确实如此。如果您在文档中没有找到“延迟”这个词,您可以非常肯定它会执行查询并立即返回结果。感谢@Timschmelter如果查询返回结果,那么可以安全地假设它已执行(否则您将如何接收结果)。因此,如果我对原始查询执行.ToList(),而不执行Any()检查,这也有助于提高绩效吗?因为这样看来我们要运行两次?一个是Any,一个是ToList?@Bohn是的,调用
Any
然后调用
ToList
将运行两个不同的SQL查询。调用
ToList
然后调用
Any
将只执行一个SQL查询。因此,如果我对原始查询执行.ToList(),而不执行Any()检查,这是否也有助于提高性能?因为这样看来我们要运行两次?一个和任何一个,一个和托利斯特@Bohn:这取决于结果查询是否被缓存,以及LINQ提供程序对
Any
的具体操作-但是是的,我希望它至少对性能有潜在的帮助。@Bohn-是-以
Any
结尾的查询将与以
ToList
结尾的查询不同。
Any
可能会被转换为SQL中的
EXISTS
,而
ToList
将执行完整查询并返回所有记录。然而,在列表上调用
Any
非常快(可能比SQL调用快得多)。因此,调用
ToList
然后调用
Any
可能会更快。但是,我同意Jon的观点,标准做法是返回空集合,而不是
null
(在这种情况下,您不需要
任何调用)。我支持返回空列表,而不是
null