我有两张相同的桌子。一个是实时数据,另一个是暂存数据。
它们在两列上都具有相同的唯一键约束。
使用Linq,是否可以获得Production
中Staging
不同的记录列表?
表格如下:
string name
string number
timespan timeIn
timespan timeOut
.
snip
.
string lastDay
就像我说的,两个表都是相同的,我只想要{[1}}和name
列与number
表中相同记录的假设{ {1}}和Production
组成主键。
修改
这只是name
和number
的长查询吗?
答案 0 :(得分:1)
组合使用LINQ join
和where
子句 - 类似这样:
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
我只包含您在name
和number
之后显示的列 - 当然不是您剪过的列,但是您明白了。
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. });