2010-06-23 89 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