我有一个稍微复杂的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语句,那将非常感激。
答案 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
。
恕我直言,对于这种复杂的连接,方法语法很尴尬。查询语法更具可读性。