2

我敢肯定,我可以得到我從一個單一的LINQ聲明想要的結果,我只是不能由我自己找到它!這是我到目前爲止有:的Linq:多個子加入或子查詢

var query = from uir in Aspnet_UsersInRoles 
     join r in Aspnet_Roles 
     on uir.RoleId equals r.RoleId 
     select new 
     { 
      UserId = uir.UserId, 
      RoleName = r.RoleName 
     }; 

var query2 = from q in query 
     group q by q.UserId into roles 
     select new 
     { 
      UserId = roles.Key, 
      Roles = roles.Distinct() 
     }; 

var query3 = from u in Aspnet_Users 
     join q in query2 
     on u.UserId equals q.UserId 
     select new 
     { 
      UserId = u.UserId, 
      UserName = u.UserName, 
      Roles = q.Roles 
     }; 

預期結果: Expected Results

,這是不正確的,即使我並不真的需要有用戶ID在「角色」列表/ IEnumerable的,只是每個UserId的角色名稱列表。

我使用asp.net成員SQL表,基本上我想獲得用戶包括他們的角色的列表。

  • 每個用戶可能有多個角色。
  • 用戶可能根本沒有作用(應該仍然顯示在結果)

能否請你幫我或點我就如何從一個單一的LINQ的聲明相同的結果正確的方向?

PS。是的,我是Linq新手和SQL老手,可能會模糊我的想法。

編輯

好吧,我想我得到它:

var q = from u in Aspnet_Users 
    from up in UserProfiles.Where(_up => _up.UserId == u.UserId).DefaultIfEmpty() 
    from uir in Aspnet_UsersInRoles.Where(_uir => _uir.UserId == u.UserId).DefaultIfEmpty() 
    from r in Aspnet_Roles.Where(_r => _r.RoleId == uir.RoleId).DefaultIfEmpty() 
    group r.RoleName by new  { 
           u.UserId, 
           u.UserName, 
           up.FirstName, 
           up.LastName, 
           u.LastActivityDate 
           } into g 
    select new 
    { 
     userID = g.Key.UserId, 
     firstName = g.Key.FirstName, 
     lastName = g.Key.LastName, 
     userName = g.Key.UserName,   
     lastActivityDate = g.Key.LastActivityDate, 
     roles = g.Distinct() 
    }; 

你覺得呢? (我從我自己的UserProfiles表中添加了信息,與Aspnet_Users的關係爲1:1)

回答

1

我相信這是等同的。

var query = from userRole in Aspnet_UsersInRoles 
      join role in Aspnet_Roles on userRole.RoleId equals role.RoleId 
      group role.RoleName by userRole.UserId into roles 
      join user in Aspnet_Users on roles.Key equals user.UserId 
      select new 
      { 
       user.UserId, 
       user.UserName, 
       Roles = roles.Distinct(), 
      }; 

看看是否能解決問題。

+0

我得到:「'userRole'這個名字不在'equals'左邊的範圍內,考慮交換'equals'兩邊的表達式。 – qbantek 2010-11-07 00:47:48

+0

如果我換,我得到了表達:「這個名字‘用戶’是不是在範圍上的‘等於’左側考慮交換上的‘等於’兩邊的表情。」 – qbantek 2010-11-07 00:48:33

+0

啊,是的,我的錯誤,我試圖保持它的可讀性,並改變我可能不應該有的東西。 groupby將'userRole'帶出範圍。 – 2010-11-07 00:53:15