2010-02-10 185 views
4

我有一個LINQ to SQL查詢來檢索所有用戶與他們的角色一起:LINQ to SQL查詢

var userRoles = from u in db.GetTable<User>() 
          join ur in db.GetTable<UserRole>() 
           on u.UserID equals ur.UserID 
          join r in db.GetTable<Role>() 
           on ur.RoleID equals r.RoleID 
           orderby u.UserID 
          select new 
             { 
              u.UserID, 
              r.RoleName 
             }; 

在系統中的用戶可以擁有多個角色。這個查詢(以表格形式)的結果是這樣的:

1管理員
1員工
2員工
3員工

我怎樣才能重新寫這個查詢返回的所有用戶角色等逗號分隔值:

1聯繫,員工
2僱員
3僱員

回答

3

嘿庫馬爾,我創建了一個小型控制檯應用程序來模仿我相信你有的數據。我認爲它展現了你正在尋找的行爲。這不是世界上最偉大的代碼,但我認爲算法是關鍵。我只是將ToString()的一個快速覆蓋放在一起以正確顯示數據。

我做的最主要的變化是創建一個定義的類要顯示的數據,並打破LINQ查詢分成兩個獨立的部分:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Test 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var users = new List<User> 
          { 
           new User 
            { 
             UserID = "1" 
            }, 
           new User 
            { 
             UserID = "2" 
            }, 
           new User 
            { 
             UserID = "3" 
            } 
          }; 

      var roles = new List<Role> 
          { 
           new Role 
            { 
             RoleID = "1", 
             RoleName = "Admin" 
            }, 
           new Role 
            { 
             RoleID = "2", 
             RoleName = "Employee" 
            } 
          }; 

      var userRoles = new List<UserRole> 
           { 
            new UserRole 
             { 
              UserID = "1", 
              RoleID = "1" 
             }, 

            new UserRole 
             { 
              UserID = "1", 
              RoleID = "2" 
             }, 

            new UserRole 
             { 
              UserID = "2", 
              RoleID = "2" 
             }, 

            new UserRole 
             { 
              UserID = "3", 
              RoleID = "2" 
             } 
           }; 

      var userRoles2 = from u in users 
          orderby u.UserID 
          select new UserList 
          { 
           UserID = u.UserID, 
           Roles = (from r in roles 
              join ur in userRoles 
              on u.UserID equals ur.UserID 
              where ur.RoleID == r.RoleID 
              select r).ToList() 
          }; 

      foreach (var item in userRoles2) 
      { 
       Console.WriteLine(item); 
      } 
      Console.ReadKey(); 
     } 
    } 

    public class User 
    { 
     public string UserID; 
    } 

    public class UserRole 
    { 
     public string UserID; 
     public string RoleID; 
    } 

    public class Role 
    { 
     public string RoleID; 
     public string RoleName; 
    } 

    public class UserList 
    { 
     public string UserID; 
     public List<Role> Roles; 

     public override string ToString() 
     { 
      string output = UserID + " "; 
      foreach (var role in Roles) 
      { 
       output += role.RoleName + ", "; 
      } 
      output = output.Substring(0, output.Length - 2); 
      return output; 
     } 
    } 
} 
2

這是做它的一種方式,沒有測試它:

from u in db.GetTable<User>() 
         join ur in db.GetTable<UserRole>() 
          on u.UserID equals ur.UserID 
         join r in db.GetTable<Role>() 
          on ur.RoleID equals r.RoleID 
         orderby u.UserID 
         group u by u.UserID into g  
         select new 
           { 
            UserId = g.Key, 
            Roles = String.Join (" ,", g.UserRoles.SelectMany(c => c.Roles).Select(p=> p.RoleName).ToArray())) 
           };