2016-11-21 191 views
1

LINQ查詢LEFT OUTER JOIN

from rc in context.RC 
join r in context.R on rc.RId equals r.Id 
join c in context.C on rc.CId equals c.Id 
join f in context.F on rc.FId equals f.Id into fg 
from f in fg.DefaultIfEmpty() 
join e in context.E on rc.EId equals e.Id into eg 
from e in eg.DefaultIfEmpty() 

生成的SQL

SELECT * 
FROM [dbo].[RC] AS [Extent1] 
     INNER JOIN [dbo].[R] AS [Extent2] ON [Extent1].[RId] = [Extent2].[Id] 
     INNER JOIN [dbo].[C] AS [Extent3] ON [Extent1].[CId] = [Extent3].[Id] 
     INNER JOIN [dbo].[F] AS [Extent4] ON [Extent1].[FId] = [Extent4].[Id] 
     INNER JOIN [dbo].[E] AS [Extent5] ON [Extent1].[EId] = [Extent5].[Id] 

我想要得到的是

SELECT * 
FROM [dbo].[RC] AS [Extent1] 
     INNER JOIN [dbo].[R] AS [Extent2] ON [Extent1].[RId] = [Extent2].[Id] 
     INNER JOIN [dbo].[C] AS [Extent3] ON [Extent1].[CId] = [Extent3].[Id] 
     LEFT JOIN [dbo].[F] AS [Extent4] ON [Extent1].[FId] = [Extent4].[Id] 
     LEFT JOIN [dbo].[E] AS [Extent5] ON [Extent1].[EId] = [Extent5].[Id] 

不知道是什麼我是密西根嗎?納克在我的LINQ查詢

代碼的屏幕快照

enter image description here

更新

基於由@GertArnold評論,RC-F(表)和RC-E(表)是N-1協會,其中RC應該持有F的有效身份證密鑰參考,但在RCFID爲零,當我做inner join時,它跳過數據。

所以現在我怎麼能強迫實體框架/ LINQ產生LEFT JOIN語法,而不改變我的數據庫架構

+0

在lambda語法,'Join'指'內Join'和'GroupJoin'是'左外Join' –

+0

LINQ查詢是精細和應產生'LEFT JOIN'。你在用什麼ORM? –

+0

@IvanStoev實體框架6 – HaBo

回答

0

基於由@GertArnold,RC-F(表)和RC-E評論(表)是N-1關聯,其中RC應該爲F保存一個有效的id關鍵字引用,但在RC表中,某些Fid是零,當我進行內部連接時,它將跳過數據。

這就是我最終查詢結果的方式。

  List<MyType> myResults; 
      using (Entities context = new Entities()) 
      { 
       var results = (from rc in context.RC 
        join r in context.R on rc.RId equals r.Id 
        join c in context.C on rc.CId equals c.Id 
        select rc).ToList(); 

       myResults = results.Select(rc => new MyType 
       { 
        Id = rc.Id, 
        Rule = new IdName 
        { 
         Id = rc.R.Id, 
         Name = rc.R.Name 
        }, 
        Conjuction = new IdName 
        { 
         Id = rc.C.Id, 
         Name = rc.C.Conjuncation 
        }, 
        Field = new IdName 
        { 
         Id = rc.F!= null ? rc.F.Id : 0, 
         Name = rc.F!= null ? rc.F.Name : null 
        }, 
        Expression = new IdName 
        { 
         Id = rc.E!= null ? rc.E.Id : 0, 
         Name = rc.E!= null ? rc.E.Expression : null 
        }, 
        DisplayOrder = rc.Order, 
        Value1 = rc.Value, 
        Value2 = rc.Value2 
       }).ToList(); 
      } 
+0

因此,您擁有*導航屬性!還是你添加了它們?無論如何,你可以刪除第一個「ToList」,所以你繼續在第二部分構建表達式。然後你可以簡單地執行'Id = rc.E.Id'等等,因爲一切都以SQL的形式運行(它沒有空引用異常)。 –

+0

我有導航屬性。將刪除.ToList(),但是當有導航屬性時,我們不能強制EF LINQ構造左外連接? – HaBo