2015-05-05 54 views
0

如果我写例如查询:是否有()运行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()是否运行查询?

+0

是的,它的确如此。如果您在文档中找不到_deferred_这个词,您可以确信它会执行查询并立即返回结果。 –

+0

谢谢@TimSchmelter – Bohn

+0

如果查询返回一个结果,那么可以安全地假定它已经执行(你将如何收到结果)。 –

回答

2

是的 - 它必须,因为它必须返回truefalse。它不能可能没有运行查询。

如果你要有条件地返回ToList(),你会更好的写作:

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

...或其实我建议你可以返回query.ToList()反正,因为它是一个很容易编写使用空列表的代码,而不是必须特殊使用空值。

+0

因此,如果我对原始查询执行.ToList()并且不执行Any()检查,它是否也有助于性能呢?因为看起来像这样我们运行了两次?一个与任何和一个ToList? - – Bohn

+1

@Bohn:那么这取决于结果查询是否被缓存,以及LINQ提供程序对“Any”所做的确实是什么 - 但是,我期望它至少有*可能*对性能的帮助。 –

+1

@Bohn - yes - 以'Any'结尾的查询将是一个以'ToList'结尾的查询。 “Any”可能会在SQL中被转换为“EXISTS”,而“ToList”将执行完整查询并返回所有记录。但是,在列表中调用'Any'会非常快(可能比SQL调用快得多)。所以调用'ToList' _then_' Any'可能会更快。不过,我同意Jon的观点,标准做法是返回一个空集合而不是'null'(在​​这种情况下,你不需要任何''调用)。 –