3

少し複雑なSQLクエリがあり、コードベースに使用しているLINQ式の構文に変換しようとしています。ただし、オンラインの誰もがクエリ構文を使用しているようです。そのため、正しい答えを見つけるのは非常に困難です。

クエリは次のとおりで、私が求めているものを正確に返します(このクエリを実行するには、おそらくもっと良い方法があります。お気軽に提案してください)。

SELECT e.*, ce.Certificate_ID
FROM FCERTSTest.dbo.Entities AS e 
INNER JOIN FCERTSTest.dbo.RequirementEntries AS re 
ON re.Position_ID = e.EntityPosition_ID
LEFT JOIN FCERTSTest.dbo.CertificateEntries AS ce
ON ce.Entity_ID = e.EntityID AND ce.Certificate_ID = re.Certificate_ID
WHERE ce.Certificate_ID IS NULL

問題はこれを変換することです。これまでのところ、私が持っているのは;

List<Entities> unqualified = new List<Entities>();

unqualified = Entities.Join(RequirementEntries,
                            ent => ent.EntityPosition_ID,
                            req => req.Position_ID,
                            (ent, req) => ent).ToList();

私がインターネットから引き出したもの...正直なところ、クエリを100%理解していませんが、ポジションに要件があるエンティティを取得します。これは、本来の目的です。

最後に、誰かがSQLステートメントの残りの部分を変換するのを手伝ってくれるなら、それは大いにありがたいです。

4

1 に答える 1

3

これは、元のクエリがLINQメソッド構文でどのように見えるかを示しています。

unqualified = Entities.Join(RequirementEntries,
                            ent => ent.EntityPosition_ID,
                            req => req.Position_ID,
                            (e, r) => new {e,r})
                      .GroupJoin(CertificateEntries.Where(c=>c.CertificateID == null),
                                 req => new{ Cid = (int?) req.r.Certificate_ID, Eid = (int?) req.e.EntityID },
                                 cer => new{ Cid = (int?) cer.Certificate_ID, Eid = (int?) cer.EntityID },
                                 (x,y) => new {EnRe = x, Cer = y })
                      .SelectMany(x=> x.Cer.DefaultIfEmpty(),
                                  (x,y) => new { Ent = x.Enre.e, Certs = y});

ここGroupJoinではSQLと同等ですLEFT JOIN

私見ですが、メソッドの構文は、このような複雑な結合には扱いにくいものです。クエリ構文ははるかに読みやすくなります。

于 2013-02-05T09:01:27.267 に答える