C# Linq-带点符号的左外连接

C# Linq-带点符号的左外连接,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,如何使用点表示法在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 =

如何使用点表示法在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
。我还尝试:

var query2 = db.Users.GroupJoin(db.Defects, 
                u => u.userID, 
                d => d.userID, 
                (user, defect) => new { user, defect.DefaultIfEmpty() });
根本无法编译。所有在线示例似乎都使用(更清晰的)查询语法

我想你想要这个:

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 });

有关更多详细信息,请参见my。

Wow-我想这就是为什么所有示例都使用查询语法:)@Adam:是的,联接在查询语法上更简单:)我在Microsoft的DefaultIfEmpty上找到的所有文档都说(示例显示),当给定的枚举为空时,它会返回一个默认项的枚举。左侧外部联接示例都显示,当枚举中的特定项为null时,它返回一个默认项。我知道这是可行的,但是这个特殊(显然不同)方法的文档在哪里?谢谢@凯莉:我不知道你的意思。关键是,当“left”元素没有匹配项时,GroupJoin将以“右侧”的空组结束。SelectMany然后将每个“左”项与“右”项配对,但如果组为空,则使用null的“右”项。