2016-03-01 77 views
0

我探索了很多,并开始知道在LINQ中没有直接的方法来应用左连接。所以我知道,使用交叉连接相同,然后过滤记录。无法应用左连接linq

我试过应用,但仍没有从左边获取所有记录。

这里是我的审判:

List<UserAttendanceHistory> lstUserAttendanceHistory = (from registeredAppUser in registeredAppUsers 
                    from userAttendanceHistory in lstUserAttendance.DefaultIfEmpty() 
                    where registeredAppUser.EmailID == userAttendanceHistory.EmailID 
                    //on userAttendanceHistory.EmailID equals registeredAppUser.EmailID 
                    select new UserAttendanceHistory() 
                    { 
                     ContactName = registeredAppUser.ContactName, 
                     EmailID = userAttendanceHistory.EmailID, 
                     Status = userAttendanceHistory.Status 
                    }).ToList(); 

我有6条在lstUserAttendance和11个记录registeredAppUsers。我希望输出中的所有来自registeredAppUsers的11条记录。

我知道有很多类似的问题,但我发布这个,因为我无法弄清楚。

任何帮助,非常感谢。

回答

1

这有点复杂。我的做法是做一个组连接,其中右侧(通用段或用户)是关键,左侧(条件段或出席历史)是分组元素。然后SelectMany将列表的列表投影到单个结果中。

var userAttendanceHistory = 
registeredAppUsers.GroupJoin(lstUserAttendance, 
rAU=>rAu.EmailID, 
lUA=>lUA.EmailId, 
(u,a) => new {user=u, attend=a}) 
.SelectMany(anonType=> anonType.DefaultIfEmpty(), 
(us,at) => new UserAttendanceHistory()                 {ContactName = us.ContactName, 
EmailID = us.EmailID, 
Status = at == null ? "Not attended": at.Status 
}).ToList(); 
0

join clause (C# Reference)所述,左连接模式在LINQ是这样

​​

把它应用到您的查询:

var lstUserAttendanceHistory = (
    from registeredAppUser in registeredAppUsers 
    join userAttendanceHistory in lstUserAttendance 
    on registeredAppUser.EmailID equals userAttendanceHistory.EmailID 
    into registeredAppUserHistory 
    from userAttendanceHistory in registeredAppUserHistory.DefaultIfEmpty() 
    select new UserAttendanceHistory() 
    { 
     ContactName = registeredAppUser.ContactName, 
     EmailID = userAttendanceHistory.EmailID, 
     Status = userAttendanceHistory.Status 
    }) 
    .ToList();