2011-11-15 1 views
7

私はLINQで本当のLEFT JOINを実行する方法を見つけようと最後の2日間を費やしましたが、成功しませんでした。 "Primary2Address"カラムがあり、しばしばNULLになるユーザテーブルがあります。 私はここでLEFT JOINをしなければなりません。さらに、Addressテーブルでは、NULLである可能性があるより多くの関係があるので、複数のLEFT JOINSを実行する必要があります。
すべてのLINQの試行は、UNIONS、ネストされたSELECTステートメントなどの不吉なものを含む重大なCRAZY SQL文を出力します。
私は必要なのは、次のとおりです。LINQのLEFT JOINをエンティティに移動する方法は?

SELECT u.UserName FROM Users u 
LEFT JOIN Addresses a ON a.AddressiD = u.Primary2Address 
LEFT JOIN States s ON s.StateID = a.Address2State 
LEFT JOIN Countries c ON c.CountryID = a.CountryID 

助けてください!これまでの私の回避策は、上記のSQL文を使用するストアドプロシージャを作成することでしたが、LINQ(L2E)でこれを実行しようとしました。 ありがとうございました!

+3

のために参加するどのようにあなたのクエリは、ちょうど 'ユーザーからu'をu.UserNameを選択の違いは? – svick

答えて

18

DefaultIfEmptyは左のために使用されているEntityFramework 4+

var query = from u in context.Users 
      from a in context.Addresses 
          .Where(x => u.Primary2Address == x.AddressiD) 
          .DefaultIfEmpty() 
      from s in context.States 
          .Where(x => a.Address2State == x.StateID) 
          .DefaultIfEmpty() 
      from c in context.Countries 
          .Where(x => a.CountryID == x.CountryID) 
          .DefaultIfEmpty() 
      select u.UserName; 
+0

あなたは私のヒーローです!うわー、ずっと時間がたってから....あなたの質問は彼らが来るのと同じくらい真っ直ぐで、今はそれを手に入れます。 100万ドルのAducciありがとう! – Losbear

+0

質問に対する@ svickのコメントによると、これは 'from u in context.Users from u.UserName'とどう違うのですか? – AakashM

+0

@AakashM - 複数のアドレスを持つユーザーがいる場合、別の結果が得られます。もっと重要なのは、私はその質問が単純化されたと思う。 – Aducci