LINQ在两个单独的表中查找不同的记录

时间:2013-05-06 03:30:57

标签: c# linq

我有两张相同的桌子。一个是实时数据,另一个是暂存数据。

它们在两列上都具有相同的唯一键约束。

使用Linq,是否可以获得ProductionStaging不同的记录列表?

表格如下:

string name
string number
timespan timeIn
timespan timeOut
.
snip
.
string lastDay

就像我说的,两个表都是相同的,我只想要{[1}}和name列与number表中相同记录的假设{ {1}}和Production组成主键。

修改

这只是namenumber的长查询吗?

2 个答案:

答案 0 :(得分:1)

组合使用LINQ joinwhere子句 - 类似这样:

from s in Staging
join p in Production on new {s.name, s.number} equals new {p.name, p.number}
where s.timeIn != p.timeIn || s.timeOut != p.timeOut || s.lastDay != p.lastDay
select s

我只包含您在namenumber之后显示的列 - 当然不是您剪过的列,但是您明白了。

C# Programming Guide提供了有关使用复合键加入的更多信息。

答案 1 :(得分:0)

它们是一个Except子句,它将为您提供生产中的所有记录,除了那些相同的记录,因此生产中有所不同。请注意,这意味着Staging中可能存在不同的记录,但您不会看到它们。 J0e3gan的查询正好相反,只显示与生产不同的登台记录。

如果你想看到所有的区别,你真的需要运行两次查询,每次都反转,然后将它们联合起来。这与您在SQL中使用EXCEPT语句的技术相同。

db.production.Except(db.staging);

或更像

db.production.Except(db.staging).Union( db.staging.Except(db.production) );

请注意,这可能仅在登台和生产的实体类型相同时才有效。你可能需要这样做

db.production.Except(db.staging.Select(s=> new ProductionEntity{ id = s.id, name = s.name, lastDay = s.lastDay ,etc. });