我有两张表有相似结构的表。每个表都有Id
和FirstValue
以及SecondValue
字段。我想使用Linq-to-SQL来获取TableOne
中的每一行而不是TableTwo
中的每一行(基于Id
)并获取两个表中的每一行,但是具有不同的行值FirstValue
或SecondValue
。 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();
该查询中的问题是,如果TableOne
和TableTwo
具有匹配的值,则仍会返回该行,但所有TableTwo
值都为null。如果一行在每个表中具有相同的值,我希望它根本不返回。
答案 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