我有一个LINQ查询,它检索所有用户及其角色:
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名雇员
发布于 2010-02-10 21:59:02
嗨,库马尔,我创建了一个小型控制台应用程序来模仿我相信你拥有的数据。我认为它显示了你想要的行为。这不是世界上最伟大的代码,但我认为算法才是重点。我刚刚对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;
}
}
}发布于 2010-02-10 22:39:57
这是一种方法,还没有测试过:
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()))
}; https://stackoverflow.com/questions/2240195
复制相似问题