使用LEFT JOIN到LINQ表达式语法的多个连接语句

时间:2013-02-05 05:37:59

标签: c# linq entity-framework linq-method-syntax

我有一个稍微复杂的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语句,那将非常感激。

1 个答案:

答案 0 :(得分: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

恕我直言,对于这种复杂的连接,方法语法很尴尬。查询语法更具可读性。