2011-03-30 122 views
16

如何使用点符号在linq中执行左外连接?Linq - 带点符号的左外连接

这里的查询表达式:

var query = from u in db.Users 
      join d in db.Defects on u.userID equals d.userID into defectsGroup 
      from d in defectsGroup.DefaultIfEmpty() 
      select new { u, d }; 

这里是我的尝试:

var query2 = db.Users.GroupJoin(db.Defects.DefaultIfEmpty(), 
       u => u.userID, 
       d => d.userID, 
       (user, defect) => new { user, defect }); 

但缺陷是显示为IEnumerable<Defect>而不仅仅是Defect。我也试过:

var query2 = db.Users.GroupJoin(db.Defects, 
       u => u.userID, 
       d => d.userID, 
       (user, defect) => new { user, defect.DefaultIfEmpty() }); 

哪个根本不会编译。所有在线示例似乎都使用(更清晰)查询语法。

回答

22

我想你想要这样的:

var query2 = db.Users.GroupJoin(db.Defects, 
           u => u.userId, 
           d => d.userID, 
           (u, defectsGroup) => new { u, defectsGroup}) 
        .SelectMany(z => z.defectsGroup.DefaultIfEmpty(), 
           (z, d) => new { z.u, d }); 

见我Edulinq blog post on query expressions了解更多详情。

+2

哇 - 我想这就是为什么所有的样品使用的是:) – 2011-03-30 14:54:07

+0

@Adam查询语法:是的,连接是在查询语法,而更简单的:) – 2011-03-30 15:32:11

+0

所有我能找到微软DefaultIfEmpty的文件说(和实例当给定的枚举为空时,它返回一个默认项目的枚举。左外部连接示例都显示它在枚举中的PARTICULAR项为null时返回默认项。我发现这很有效,但是这个特别的(明显不同的)方法的文档在哪里?谢谢! – 2011-04-26 14:48:59