2016-08-17 43 views
4

在LINQ to對象是有這個代碼之間在執行任何區別:LINQ到對象多條語句與單個語句

var changedFileIDs = updatedFiles.Where(file => file.CurrentVersion != file.OriginalVersion).Select(file => file.ID); 
var changedVaultFiles = filesToUpdate.Where(x => changedFileIDs.Contains(x.ID)); 
foreach (var file in changedVaultFiles) 
{ 
    Vault.Upload(file); 
} 

和驗證碼?

var changedVaultFiles = filesToUpdate.Where(x => updatedFiles.Where(file => file.CurrentVersion != file.OriginalVersion).Select(file => file.ID).Contains(x.ID)); 
foreach (var file in changedVaultFiles) 
{ 
    Vault.Upload(file); 
} 
+0

不,性能沒有差異。 (除非你沒有在第一個集合中調用'ToArray') – 2016-08-17 13:07:11

回答

2

沒有,在性能上沒有什麼區別,因爲LINQ的特徵之一是deferred execution,換句話說,您的查詢是不會被執行,直到查詢變量是在foreachfor遍歷,或者調用ToListToArray擴展方法。因此,在第一個示例中,您正在編寫主要查詢,但在遍歷它之前不會執行。

你會發現在這個link有關查詢執行如何在LINQ中工作的更多細節。

延遲執行概要:LINQ查詢是由用戶創建

之後,它被轉換成一個命令 樹。命令樹是查詢的表示。然後,在查詢變量爲 (而不是查詢變量創建時)時,針對數據源執行命令樹 。在查詢 執行時間,評估所有查詢表達式(即查詢的所有組件),包括在結果實現中使用的那些表達式。

+0

謝謝,這是我的想法,但想要確認,並找不到任何明確說明它的來源。也許我只是使用了錯誤的搜索條件。 – Adam