2017-05-14 66 views
2

我發現這個代碼在LINQ - Full Outer Join實現差異連接和右外連接在LINQ

var leftOuterJoin = from first in firstNames 
        join last in lastNames 
        on first.ID equals last.ID 
        into temp 
        from last in temp.DefaultIfEmpty(new { first.ID, Name = default(string) }) 
        select new 
        { 
         first.ID, 
         FirstName = first.Name, 
         LastName = last.Name, 
        }; 
var rightOuterJoin = from last in lastNames 
        join first in firstNames 
        on last.ID equals first.ID 
        into temp 
        from first in temp.DefaultIfEmpty(new { last.ID, Name = default(string) }) 
        select new 
        { 
         last.ID, 
         FirstName = first.Name, 
         LastName = last.Name, 
        }; 

包含此代碼的答案有很多upvotes的,但我在這裏觀察了什麼。在左外連接中,它使用intofrom與第二個實體,在右外連接中執行相同操作。所以,這兩個實現對我來說都是一樣的。你能告訴我左外連接和右外連接的區別嗎?提前致謝。

編輯:

我覺得右外連接應該是這樣的:

var rightOuterJoin = from first in firstNames 
        join last in lastNames 
        on first.ID equals last.ID 
        into temp 
        from first in temp.DefaultIfEmpty(new { last.ID, Name = default(string) }) 
        select new 
        { 
         last.ID, 
         FirstName = first.Name, 
         LastName = last.Name, 
        }; 
+0

它在這個網站也是一樣的:http://www.dotnetfunda.com/codes/show/1849/how-to-use-left-right-outer-join-in-linq我真的看不到不同的是:( – jason

+1

我不明白這個問題,你把左邊的東西變成正確的東西是你交換左邊和右邊的東西,這是在這裏做了什麼,你爲什麼認爲這是錯誤的? –

+0

'temp'變量的類型是'IEnumerable '在左連接中,但是在右邊的'IEnumerable '類型,所以有差別。 – Evk

回答

1

下面是不同類型的連接的可視化解釋。

Visual Representation of Joins

的主要區別是,LEFT將保留所有記錄,從第1表(或左表),而RIGHT將保留所有記錄,從第2表。

即使在記錄中找到NULL值,OUTER也會返回行。

+0

是的,我知道這個圖表,但這並不能回答我的問題。實施**?上面的代碼是否正確,如果是,如何?如果沒有如何? – jason