2015-05-05 53 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'(在​​這種情況下,你不需要任何''調用)。 –