LINQ:使用左连接

时间:2016-11-11 18:21:03

标签: c# sql asp.net linq

假设我在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查询中处理这个问题。

1 个答案:

答案 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所示。