誰かがこれを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のアイテムを見つけることです。
以下のようなもの
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
ただし、コンパイラは、名前が付けられた2つのプロパティを使用して匿名型(実際には1つの型)を作成し、その実装で使用する実装をcid
提供します。私がこの句を選択したのは、原因を導入すると、コンパイラが通常の呼び出しの代わりに実行するためです。Equals
GetHashCode
Join
gj
into
into
GroupJoin
Join
クエリに追加して、以前は句で隠されていfrom d in gj.DefaultIfEmpty()
た範囲変数を復元する句を追加することで、SQLサンプルと同様の感覚を得ることができます。これで、元のSQLとほぼ同等に達する句を追加できます。d
into
where d == null
sid
この匿名タイプの紹介は、との両方でgroup byなどの他の操作を実行する場合に、再度使用する必要がある場合がありますcid
。