簡體   English   中英

如何用外部聯接處理復雜的LINQ查詢?

[英]How to tackle complex LINQ queries with outer join?

在我的數據庫中,我具有角色和用戶,我也具有用戶角色以將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/zh-cn/library/bb397895.aspx DefaultIfEmtpy(),但我不知道如何以及在何處放置它,這意味着我嘗試了我的代碼不編譯。

我如何獲得我所有的用戶,即使他們沒有鏈接到任何UserRoles?

首先獲取用戶,然后再包含他們的角色

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM