2016-11-21 9 views
1

LINQクエリ左外側にはC#のLINQに参加

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] 

されていません私はmissiですか?私のLINQクエリでngのコード

enter image description here

スクリーンショットの更新 @GertArnold、RC-F(テーブル)とRC-E(テーブル)でのコメントに基づいて

でありますN-1アソシエーション。RCFの有効なIDキー参照を保持するが、RCテーブルの一部、Fのidsは0である、私はinner joinのデータをスキップしています。

だから今どのように私は私のDBスキーマ@GertArnold、RC-F(テーブル)とRC-E(テーブル)でのコメントに基づいて

+0

、 'Join'は、LINQクエリは結構ですと' LEFT JOIN'を生成する必要があります 'インナーJoin'と' GroupJoin'は 'LEFT OUTER Join' –

+0

を指します。どのORMを使用していますか? –

+0

@IvanStoev Entity Framework 6 – HaBo

答えて

0

を変更せずにLEFT JOIN構文を生成するエンティティフレームワーク/ LINQを強制することができますがにあります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'を削除することができるので、2番目の部分に式を構築し続けます。そして、すべてが(ヌル参照例外を持たない)SQLとして実行されるので、単に 'Id = rc.E.Id'などを行うことができます。 –

+0

私はナビゲーションプロパティを持っていました。 .ToList()は削除されますが、ナビゲーションプロパティがあるときにEF LINQを強制的に左外部結合を構成することはできません。 – HaBo