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は整数です。

私がやろうとしているのは、dbvfにないvfのアイテムを見つけることです。

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;

ここで使用されている匿名タイプは、初心者には黒魔術のように見えます。sidただし、コンパイラは、名前が付けられた2つのプロパティを使用して匿名型(実際には1つの型)を作成し、その実装で使用する実装をcid提供します。私がこの句を選択したのは、原因を導入すると、コンパイラが通常の呼び出しの代わりに実行するためです。EqualsGetHashCodeJoingjintointoGroupJoinJoin

クエリに追加して、以前は句で隠されていfrom d in gj.DefaultIfEmpty()た範囲変数を復元する句を追加することで、SQLサンプルと同様の感覚を得ることができます。これで、元のSQLとほぼ同等に達する句を追加できます。dintowhere d == null

sidこの匿名タイプの紹介は、との両方でgroup byなどの他の操作を実行する場合に、再度使用する必要がある場合がありますcid

于 2012-08-22T22:15:46.597 に答える