2012-10-04 15 views
6

SQLクエリを1対1のマッピングで左結合を作成するLINQに変換していますが、これはメソッド構文でなければなりません。私はこれを達成するために私の髪を引き剥がしてきた。私はラムダ構文でそれを行うことができます。以下は、実行しようとしているクエリの例です。実際のコードではありません。誰かが私が間違っていることを指摘するだろうか?LINQのメソッド構文でのJOINとLEFT JOINの対応

SQL:

SELECT item.*, item_status.* 
FROM item 
LEFT JOIN item_status 
    ON item.ID = item_status.itemID 
    AND item_status.FLAGGED = true 
WHERE item.published_date > "2008-06-19" 

LINQ:

var linq_query = (
    from selected_item in item 
    join selected_item_status in item_status 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    where item_status.FLAGGED = true 
    select new {selected_item, selected_item_status}).ToList(); 
+0

コードが実際にコード化されていない場合、どのように間違っているか教えてください。 'Item'、' item_status'のクラスと、匿名型のリストを入れるクラスを見てもいいですか? –

答えて

8

join ... intoGroupJoinになり、第二fromSelectMany次のようになります。Whereは左を作るよう

var linq_query = Item 
    .GroupJoin(
     item_status.Where(x => x.selected_item_status.FLAGGED), // EDIT: Where clause moved here. 
     selected_item => selected_item.ID, 
     selected_item_status => selected_item_status.itemID, 
     (selected_item, joined) => new 
     { 
      selected_item, 
      statuses = joined.DefaultWithEmpty(), 
     }) 
    .SelectMany(x => x.statuses.Select(selected_item_status => new 
    { 
     x.selected_item, 
     selected_item_status, 
    })) 
    // EDIT: Removed where clause. 
    .ToList(); 

に見えます外部結合が不要、nとしてとにかくullステータスが除外されます。

EDIT:いいえ、SQLを確認すると、LINQクエリが少し間違っているように見えます。

+0

ありがとう!そこに結合されたテーブルのwhere句を持つことは決して私には起こりませんでした。 – s1300045

+0

これはありがとう - 私はちょうどこの答えに来て、それは私が探しているものです。私はそれについて考えているので、そのメソッドの構文linqよりもSQlに似ているその場所にwhere節を置く。 – EGP