在List <t> </t>中查找缺少的项目

时间:2012-08-22 22:03:47

标签: c# linq

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

3 个答案:

答案 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;

这里使用的匿名类型对于初学者来说似乎是黑魔法。但是,编译器创建了匿名类型(实际上它只是一种类型),其中包含两个名为sidcid的属性,以及EqualsGetHashCode的实现{ {1}}将在其实施中使用。我为Join子句选择gj是因为引入into会导致编译器执行into而不是常规GroupJoin调用。

我可以通过添加Join子句来添加查询以获得与SQL示例类似的感觉,该子句恢复先前由from d in gj.DefaultIfEmpty()子句隐藏的d范围变量。现在我可以添加into子句几乎达到与原始SQL的奇偶校验。

如果您希望where d == nullsid同时执行其他操作(如分组),则可能需要再次使用此匿名类型简介。