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% 不理解查询,但它得到了 Entity who's Position has a Requirement,这就是它的意思。

所以最后,如果有人可以帮助我转换 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 回答