如何使用外连接处理复杂的LINQ查询?

时间:2014-07-02 16:39:44

标签: c# linq

在我的数据库中,我有角色和用户,我也有用户角色将2连在一起。

问题是试图让所有用户获得他们的角色(如果他们有任何角色,他们可能没有)。

我使用此查询:

        return (from ur in db.UserRoles
                join r in db.Roles on ur.RoleID equals r.ID
                group r by ur.UserProfileID into ugr
                join u in db.UserProfiles on ugr.Key equals u.ID
                select new UserModel() {
                    ID = u.ID,
                    Username = u.UserName,
                    IsLockedOut = u.IsLockedOut,
                    LastLoginDate = u.LastLoginDate,
                    UserRoles = (from r in ugr
                                 select new RoleModel() {
                                     Name = r.Name,
                                     ID = r.ID
                                 }).ToList()
                }).ToList();

这适用于至少拥有一个角色的用户,但我也希望用户没有角色。

我目前正在尝试使用http://msdn.microsoft.com/en-us/library/bb397895.aspx DefaultIfEmtpy(),但我不知道如何以及在何处放置它,这意味着我尝试我的代码无法编译。

如果我的所有用户都没有链接到UserRoles,我如何获得所有用户?

1 个答案:

答案 0 :(得分:2)

首先获取用户并从中包含他们的角色

return db.UserProfiles
         .Include(up => up.UserRoles)
         .Select(u => new UserModel() {
                            ID = u.ID,
                            Username = u.UserName,
                            IsLockedOut = u.IsLockedOut,
                            LastLoginDate = u.LastLoginDate,
                            UserRoles = u.Roles
                                         .Select(r => new RoleModel() {
                                                        Name = r.Name,
                                                        ID = r.ID
                                                      })
                      })
         .ToList();

根据评论更新

return db.UserProfiles
         .Include(up => up.UserRoles)
         .Include("UserRoles.Roles") // <-- Added further include
         .Select(u => new UserModel() {
                            ID = u.ID,
                            Username = u.UserName,
                            IsLockedOut = u.IsLockedOut,
                            LastLoginDate = u.LastLoginDate,
                            // Modified this to use joining table
                            UserRoles = u.UserRoles 
                                         .Select(ur => new RoleModel() {
                                                        Name = ur.Role.Name,
                                                        ID = ur.RoleID
                                                      })
                      })
         .ToList();