获取具有不同值的行或从一个表中丢失

时间:2017-04-06 13:27:49

标签: c# entity-framework linq-to-sql

我有两张表有相似结构的表。每个表都有IdFirstValue以及SecondValue字段。我想使用Linq-to-SQL来获取TableOne中的每一行而不是TableTwo中的每一行(基于Id)并获取两个表中的每一行,但是具有不同的行值FirstValueSecondValue。 SQL应该类似于

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
        ) 
      )

我试过

(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();

该查询中的问题是,如果TableOneTableTwo具有匹配的值,则仍会返回该行,但所有TableTwo值都为null。如果一行在每个表中具有相同的值,我希望它根本不返回。

1 个答案:

答案 0 :(得分:1)

使用GroupJoin从第二个表中获取与第一个表中的实体对应的所有记录。然后只需获取那些在第二个表中没有匹配记录或具有不同值的记录:

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