假设我在SQL中有这个查询:
SELECT
....
FROM
TableA a
JOIN TableB b on a.Id = b.Id
我已经将它作为一个linq查询正常工作了:
var results = (from a in db.TableA
join b in db.TableB on a.Id equals b.Id
select new MyObject {...}).ToList();
但是现在我想在混音中添加左连接。在SQL中:
SELECT
....
FROM
TableA a
JOIN TableB b on a.Id = b.Id
LEFT JOIN TableC c on a.Id2 = c.Id2
我不知道如何在linq查询中处理这个问题。
答案 0 :(得分:1)
当您考虑到您真正想要做的事情时,SQL LEFT JOIN
概念是一个非常笨重的抽象概念。对于每个TableA条目,您真的希望有一个与之关联的TableC项列表,对吗?
LINQ使用更简单(IMO)的方式来表示此抽象,因为它具有嵌套的分层对象的概念。提供者将生成LEFT JOIN,但它也会将结果构建到易于使用的对象结构中。
var results = (from a in db.TableA
join b in db.TableB on a.Id equals b.Id
select new MyObject {
...
TableCEntries =
from c in db.TableC
where c.Id == a.Id
select c // or select specific values from c
}).ToList();
如果你真的希望你的结果与左外连接一样扁平化,你可以这样做:
var results = (from a in db.TableA
join b in db.TableB on a.Id equals b.Id
from c in db.TableC
where c.Id == a.Id
select new MyObject {
...
}).ToList();
...但是您不会获得TableA的任何条目,其中TableC没有条目。对于这种行为,您必须使用group by
/ DefaultIfEmpty
执行丑陋的操作,如Ivan Stoev's link所示。