C# 如何使用LINQ展平表
我有一个疑问:C# 如何使用LINQ展平表,c#,linq,C#,Linq,我有一个疑问: var usersByBranch = (from u in _db.VRT_User join urb in _db.VRT_UserRoleBranch on u.UserId equals urb.UserId join r in _db.VRT_Role on urb.RoleId equals r.RoleId
var usersByBranch = (from u in _db.VRT_User
join urb in _db.VRT_UserRoleBranch on u.UserId equals urb.UserId
join r in _db.VRT_Role on urb.RoleId equals r.RoleId
where branches.Contains(urb.BranchId)
select new UserRoleBranchModel
{
UserId = u.UserId,
BranchId = urb.BranchId,
RoleId = urb.RoleId,
RoleName = r.RoleName
});
在这个查询中,对于相同的userId,将分别返回具有相同BranchId的roleId(1-4)和RoleName
我希望将行展平,以便具有相同用户ID的行包含同一BranchId中的所有RoleId和RoleName
非常感谢您的帮助。不确定您所说的包含是什么意思,但您不能使用相同的
UserRoleBranchModel
来担任多个角色,因此匿名对象将完成以下任务:
var usersByBranch = (from u in _db.VRT_User
join urb in _db.VRT_UserRoleBranch on u.UserId equals urb.UserId
join r in _db.VRT_Role on urb.RoleId equals r.RoleId
where branches.Contains(urb.BranchId)
group u by u.UserId into g
select new UserRoleBranchModel
{
UserId = g.Key,
BranchId = g.First().BranchId,
RoleId = g.First().RoleId,
RoleName = g.First()RoleName
});
var usersByBranch = (from u in _db.VRT_User
join urb in _db.VRT_UserRoleBranch on u.UserId equals urb.UserId
join r in _db.VRT_Role on urb.RoleId equals r.RoleId
where branches.Contains(urb.BranchId)
group r by new { urb.UserId, urb.BranchId } into rg
select new {
UserId = rg.Key.UserId,
BranchId = rg.Key.BranchId,
Roles = rg.Select(r => r)
});
不确定您所说的包含是什么意思,但您不能使用相同的
UserRoleBranchModel
来持有多个角色,因此匿名对象将执行以下操作:
var usersByBranch = (from u in _db.VRT_User
join urb in _db.VRT_UserRoleBranch on u.UserId equals urb.UserId
join r in _db.VRT_Role on urb.RoleId equals r.RoleId
where branches.Contains(urb.BranchId)
group r by new { urb.UserId, urb.BranchId } into rg
select new {
UserId = rg.Key.UserId,
BranchId = rg.Key.BranchId,
Roles = rg.Select(r => r)
});
这将创建3个子查询。在选择之前添加一个
让f=g.First()
,感谢您的快速响应。缺少一些{和/或(或)。请编辑代码好吗?您应该将u.UserId分组到g。错误消息现在显示VRT_用户不包含g.First().BranchId、g.First().RoleId和g.First().RoleName。它们在VRT_UserRoleBranch中,并在UserRoleBranchModel中定义。我删除了g.FirstOrDefault().RoleName和我能够运行该应用程序。可能我不够清楚。结果集不是我所期望的。它在一行中返回了一个在同一个分支中包含RoleId的用户ID。我希望得到一行,其中包含一个用户ID以及该用户ID在该分支中包含的所有RoleId值。例如,用户ID 1包含RoleId(1-4)在分支1中。它应该作为一行返回,而不是每个roleId都返回多行userId 1。这将创建3个子查询。在select之前添加一个让f=g.First()
,感谢快速响应。有一些{和/或(缺失。您可以编辑代码吗?您应该将按u.UserId将u分组到g
。错误消息现在显示VRT_用户不包含g.First().BranchId、g.First().RoleId和g.First().RoleName。它们在VRT_UserRoleBranch中,并在UserRoleBranchModel中定义。我删除了g.FirstOrDefault().RoleName和我能够运行该应用程序。可能我不够清楚。结果集不是我所期望的。它在一行中返回了一个在同一个分支中包含RoleId的用户ID。我希望得到一行,其中包含一个用户ID以及该用户ID在该分支中包含的所有RoleId值。例如,用户ID 1包含RoleId(1-4)在分支1中。它应该作为一行返回,而不是每个roleId返回多行userId 1。