如果我寫例如查詢:是否有()運行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
如果查詢返回一個結果,那麼可以安全地假定它已經執行(你將如何收到結果)。 –