2010-06-23 83 views
1

我有3個表:LINQ to SQL和加入問題

USER 
===== 
USER_ID(PK) 
FISRT_NAME 
LAST_NAME 
... 

ROLES 
====== 
ROLE_ID (PK) 
NAME 

USER_ROLES 
========== 
USER_ID(PK, FK) 
ROLE_ID(PK, FK) 

我想提取所有用戶數據和他的所有角色(以逗號分隔)成單行。
Sometging這樣的:

1 | John | Smith | Power user, Administrator 
2 | John | Doe | Guest 

我不知道如何做到這一點。感謝您的幫助。

編輯:
我想是這樣的:

List<UserDTO> users = null; 

using (CarShopDataContext dc = DB.GetContext()) 
{ 
    users = (from u in dc.Users 
       select new UserDTO 
       { 
        UserId = u.UserId, 
        Username = u.Username, 
        FirstName = u.FirstName, 
        LastName = u.LastName, 
        Roles = "" 
       }).ToList(); 

    foreach (var user in users) 
    { 
     var roles = (from ur in dc.UserRoles 
         join r in dc.Roles on ur.RoleId equals r.RoleId 
         where ur.UserId == user.UserId 
         select r.Name).ToList(); 

     StringBuilder userRoles = new StringBuilder(); 
     for (int j = 0; j < roles.Count; j++) 
     { 
      userRoles.Append(roles[j]); 

      if (j < roles.Count - 1) 
       userRoles.Append(", "); 
     } 

     user.Roles = userRoles.ToString(); 
    } 
} 

return users; 

回答

0

SQL服務器沒有任何聚合運算符產生一個CSV列表你想可能是最好通過查詢使用LINQ所產生的數據來實現等什麼-to-實體:

var rows = 
    (from u in context.User 
    join ur in context.UserRoles on u.User_ID equals ur.User_ID 
    join r in context.Roles on ur.Role_ID equals r.Role_ID 
    select new 
    { 
     FirstName = u.First_Name, 
     LastName = u.Last_Name, 
     RoleName = r.Name 
    }).AsEnumerable(); 

var roles = 
    from r in rows 
    group r by new {r.FirstName, r.LastName} into g 
    select new 
    { 
     FirstName = g.Key.FirstName, 
     LastName = g.Key.LastName, 
     Roles = g.Select(x => x.RoleName).Aggregate((x, y) => x + "," + y) 
    }; 
+0

我使用LINQ 2 SQL,我聚合函數收到錯誤:「無法轉換lambda表達式委託類型「System.Func '因爲一些返回類型i n該塊不會隱式轉換爲委託返回類型「 – 2010-06-23 09:03:08

+0

請參閱已更新的答案。以前的LINQ試圖在整個匿名對象上執行聚集協調 - 我現在要求它只是簡單地選擇'RoleName'字段。 – 2010-06-23 09:54:41