有人可以帮我把它转换成 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 是整数。
我想做的是在 vf 中找到 dbvf 中缺少的项目。
像下面的东西
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}
尝试这个
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);
尝试这样的事情:
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
andcid
的属性,并提供了用于Equals
和GetHashCode
将Join
在其实现中使用的实现。我选择gj
forinto
子句是因为引入了into
编译器执行 aGroupJoin
而不是常规Join
调用的原因。
我可以添加到查询中,通过添加一个from d in gj.DefaultIfEmpty()
子句来恢复d
以前被该子句隐藏的范围变量,从而获得与您的 SQL 示例类似的感觉into
。现在我可以添加where d == null
几乎与原始 SQL 相同的子句。
如果您想要执行其他操作,例如 group by bothsid
和 ,则可能需要再次使用此匿名类型介绍cid
。