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。