2016-11-11 56 views
1

比方說,我有這個疑問在SQL:LINQ:將加入與左連接

SELECT 
    .... 
FROM 
    TableA a 
    JOIN TableB b on a.Id = b.Id 

我已經得到了工作得很好的LINQ查詢:

var results = (from a in db.TableA 
       join b in db.TableB on a.Id equals b.Id 
       select new MyObject {...}).ToList(); 

但現在我想還要爲組合添加左連接。在SQL中:

SELECT 
    .... 
FROM 
    TableA a 
    JOIN TableB b on a.Id = b.Id 
    LEFT JOIN TableC c on a.Id2 = c.Id2 

我不知道如何在linq查詢中處理這個問題。

+0

只需在你的tableB連接後將一行添加到db.TableC上的a.Id中加入c等於c.Id' –

+0

即使TableC現在具有匹配的記錄,它的行爲就像是LEFT JOIN幷包含TableA中的所有行(c .ID2爲空)? –

+0

你知道如何編寫[LINQ中的左外連接](https://msdn.microsoft.com/en-us/library/bb311040.aspx#Anchor_2),不是嗎?就像在查詢中沒有其他連接一樣編寫它,例如'在a.Id2上的TableC中加入c等於c.Id2在ac.DefaultIfEmpty()中的c中加入ac' –

回答

1

SQL的LEFT JOIN概念是一個非常笨重的抽象,當你思考你真正想要做什麼。對於每個TableA條目,您都希望擁有與其關聯的TableC項目列表,對嗎?

LINQ使用更簡單的(IMO)方法來表示這種抽象,因爲它具有嵌套層次對象的概念。提供程序將生成一個LEFT JOIN,但它也會將結果生成一個易於使用的對象結構。

var results = (from a in db.TableA 
       join b in db.TableB on a.Id equals b.Id 
       select new MyObject { 
        ... 
        TableCEntries = 
         from c in db.TableC 
         where c.Id == a.Id 
         select c  // or select specific values from c 
       }).ToList(); 

如果你真的想你的成績平了路,他們將與左外連接,你可以這樣做:

var results = (from a in db.TableA 
       join b in db.TableB on a.Id equals b.Id 
       from c in db.TableC 
       where c.Id == a.Id 
       select new MyObject { 
        ... 
       }).ToList(); 

...但你不會得到任何條目TableA,其中不存在TableC的條目。對於這種行爲,你必須做group by/DefaultIfEmpty醜陋的東西,如Ivan Stoev's link所示。

+0

雖然這不等同於SQL'LEFT OUTER JOIN'。 –

+0

@IvanStoev:查看我的更新。 – StriplingWarrior

+0

我看到了(並且一般同意),但對於原始OP查詢(a和b之間的連接)也可以這樣說。連接和組連接之間的選擇取決於查詢作者。格特阿諾德的評論更有意義。只是一個想法:)順便說一句,最後一次編輯是不正確的(與'where c.Id == a.Id') - 請參閱我的帖子下的帖子。 –