1

有人可以帮我把它转换成 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 中缺少的项目。

4

3 回答 3

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}
于 2012-08-22T22:10:44.667 回答
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);
于 2012-08-22T22:13:52.657 回答
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;

这里使用的匿名类型对于外行来说似乎是黑魔法。但是,编译器创建匿名类型(实际上它只是一种类型),其中恰好有两个名为sidandcid的属性,并提供了用于EqualsGetHashCodeJoin在其实现中使用的实现。我选择gjforinto子句是因为引入了into编译器执行 aGroupJoin而不是常规Join调用的原因。

我可以添加到查询中,通过添加一个from d in gj.DefaultIfEmpty()子句来恢复d以前被该子句隐藏的范围变量,从而获得与您的 SQL 示例类似的感觉into。现在我可以添加where d == null几乎与原始 SQL 相同的子句。

如果您想要执行其他操作,例如 group by bothsid和 ,则可能需要再次使用此匿名类型介绍cid

于 2012-08-22T22:15:46.597 回答