如果我写例如查询:是否有()运行LINQ查询
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()
是否运行查询?
如果我写例如查询:是否有()运行LINQ查询
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()
是否运行查询?
是的 - 它必须,因为它必须返回true
或false
。它不能可能没有运行查询。
如果你要有条件地返回ToList()
,你会更好的写作:
var list = query.ToList();
return list.Any() ? list : null;
...或其实我建议你可以返回query.ToList()
反正,因为它是一个很容易编写使用空列表的代码,而不是必须特殊使用空值。
因此,如果我对原始查询执行.ToList()并且不执行Any()检查,它是否也有助于性能呢?因为看起来像这样我们运行了两次?一个与任何和一个ToList? - – Bohn
@Bohn:那么这取决于结果查询是否被缓存,以及LINQ提供程序对“Any”所做的确实是什么 - 但是,我期望它至少有*可能*对性能的帮助。 –
@Bohn - yes - 以'Any'结尾的查询将是一个以'ToList'结尾的查询。 “Any”可能会在SQL中被转换为“EXISTS”,而“ToList”将执行完整查询并返回所有记录。但是,在列表中调用'Any'会非常快(可能比SQL调用快得多)。所以调用'ToList' _then_' Any'可能会更快。不过,我同意Jon的观点,标准做法是返回一个空集合而不是'null'(在这种情况下,你不需要任何''调用)。 –
是的,它的确如此。如果您在文档中找不到_deferred_这个词,您可以确信它会执行查询并立即返回结果。 –
谢谢@TimSchmelter – Bohn
如果查询返回一个结果,那么可以安全地假定它已经执行(你将如何收到结果)。 –