2017-04-06 17 views
1

私は、同様の構造を持つ2つのテーブルを持っています。各テーブルはIdFirstValueSecondValueフィールドを持っています。私はLinq-to-SQLを使用して、TableTwoIdに基づいて)にはないTableOneの各行を取得し、両方のテーブルにある各行を取得しますが、異なる値はFirstValueまたはSecondValueです。 SQLは、私が 異なる値を持つ行を取得するか、1つのテーブルから行を取得しない

(from a in context.TableOne 
from b in context.TableTwo.Where(b => 
      a.Id == b.Id && 
     (a.FirstValue != b.FirstValue || 
      a.SecondValue != b.SecondValue)).DefaultIfEmpty() 
select a).ToList(); 

を試してみた

SELECT TableOne.* 
FROM TableOne 
    LEFT OUTER JOIN TableTwo 
     ON TableOne.Id = TableTwo.Id 
WHERE TableTwo.Id IS NULL 
    OR (TableTwo.Id IS NOT NULL AND 
     (TableOne.FirstValue <> TableTwo.FirstValue OR 
     TableOne.SecondValue <> TableTwo.SecondValue 
     ) 
    ) 

のようなものでなければなりません

そのクエリで問題がTableOneTableTwoが一致する値を持っている場合は、まだ行が返されるということですが、TableTwoのすべて値はnullです。各テーブルで同じ行の値がある場合は、まったく返されないようにします。

答えて

1

GroupJoinを使用すると、最初のテーブルのエンティティに対応する2番目のテーブルのすべてのレコードを取得できます。次に、一致するレコードが2番目のテーブルにないか、または異なる値を持つレコードを取得します。

from a in context.TableOne 
join b in context.TableTwo on a.Id equals b.Id into g 
from b in g.DefaultIfEmpty() 
where b == null || a.FirstValue != b.FirstValue || a.SecondValue != b.SecondValue 
select a 
+1

ありがとうございます。それは完璧に働いた。 –

関連する問題