2013-05-09 76 views
0

LINQ的join ... into.DefaultIfEmpty()如何工作來表示左連接?LINQ的左連接「加入...」和「DefaultIfEmpty()」如何工作?

是否.DefaultIfEmpty()得到評估一次,或n次?

+0

'DefaultIfEmpty'如何不直觀?如果集合爲空,它將返回默認值,如果不是,則返回原始集合。這是確保結果序列不爲空的一種方法。它在連接操作中的每一個序列都被調用,只要輸入序列至少有一個值,它就不會執行任何操作。也許你應該用方法語法而不是查詢語法寫出來;有時候人們更容易理解。 – Servy 2013-05-09 19:44:43

+0

你問在LINQ-to-objects中組加入的實現是什麼?或者如何將組加入轉換爲方法調用?或者是什麼?我在理解這裏的問題真的有些困難。 – 2013-05-09 19:47:04

+0

@EricLippert - 我首先想到的是Linq對象。但是現在你問,我有興趣知道linq IQueryProviders的答案如何變化。 – 2013-05-09 19:50:22

回答

5

假設我們正在談論LINQ到對象,DefaultIfEmpty將在結果中的每個元素進行一次評估。它將按照與連接的「左」部分匹配的值組的順序進行評估。因此,如果我們有:

from x in foo 
join y in bar into z 
let g = z.DefaultIfEmpty() 
select new { x, g.Count() } 

然後爲每個x值,會有DefaultIfEmpty調用。對於非空序列,這隻會傳遞值。對於空序列,返回(一次)默認值。

查看my Edulinq blog post on it瞭解更多信息。