有人可以把它转换成C#LINQ吗?
SELECT *
FROM vf
LEFT JOIN dbvf
ON vf.sid =dbvf.sid
AND vf.cid =dbvf.cid
WHERE dbvf.sid IS NULL
vf和dbvf都是List<T>
。 sid和cid是整数。
我想要做的是在vv中找到dbvf中缺少的项目。
答案 0 :(得分:1)
如下所示
from dbvf in dbvfs
from vf in vfs
where vf.sid == dbvf.sid && vf.cid == dbvf.cid
where dbvf.sid == null
select new { dbvf = dbvf, vf = vf}
答案 1 :(得分:1)
试试这个
var ret = from p1 in vf
join p2 in dbvf
on p1.sid equals p2.sid && p1.cid equals p2.cid into g
from p2 in g.DefaultIfEmpty()
where p2 == null
select new {vf=p1, dbvf=p2}
或这个简单的
vf.Except(dbvf);
答案 2 :(得分:0)
尝试这样的事情:
var query =
from v in vf
join d in dbvf
on new { v.sid, v.cid }
equals new { d.sid, d.cid } into gj
where !gj.Any()
select v;
如前所述,你的目的是做一个“除外”。我已经用左连接语义回答了如何做到这一点。
var query =
from v in vf
join d in dbvf
on new { v.sid, v.cid }
equals new { d.sid, d.cid } into gj
from d in gj.DefaultIfEmpty()
where d == null
select v;
这里使用的匿名类型对于初学者来说似乎是黑魔法。但是,编译器创建了匿名类型(实际上它只是一种类型),其中包含两个名为sid
和cid
的属性,以及Equals
和GetHashCode
的实现{ {1}}将在其实施中使用。我为Join
子句选择gj
是因为引入into
会导致编译器执行into
而不是常规GroupJoin
调用。
我可以通过添加Join
子句来添加查询以获得与SQL示例类似的感觉,该子句恢复先前由from d in gj.DefaultIfEmpty()
子句隐藏的d
范围变量。现在我可以添加into
子句几乎达到与原始SQL的奇偶校验。
如果您希望where d == null
和sid
同时执行其他操作(如分组),则可能需要再次使用此匿名类型简介。