【问题标题】:How to flatten tables using LINQ如何使用 LINQ 展平表格
【发布时间】:2017-07-26 07:15:58
【问题描述】:

我有这个查询:

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。

我想展平这些行,以便具有相同 userId 的行包含同一 BranchId 中的所有 RoleId 和 RoleName。

非常感谢您的帮助。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    不确定您所说的包含是什么意思,但您不能使用相同的 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)
                         });
    

    【讨论】:

      【解决方案2】:
      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
                                   });
      

      【讨论】:

      • 这将创建 3 个子查询。在选择之前添加let f = g.First()
      • 感谢您的快速回复。有一些 { 和/或 ( 丢失。您能编辑代码吗?
      • 你应该只有group u by u.UserId into g
      • 错误消息现在显示 VRT_User 不包含 g.First().BranchId、g.First().RoleId 和 g.First().RoleName。它们在 VRT_UserRoleBranch 中并在 UserRoleBranchModel 中定义。
      • 我删除了 g.FirstOrDefault().RoleName 并且能够运行该应用程序。也许我不够清楚。结果集不是我所期望的。它在一行中的同一分支中返回了一个带有 RoleId 的 UserId。我想要的是获得一个包含 UserId 和该 UserId 在分支中的所有 RoleId 值的行。例如,userId 1 在 Branch 1 中有 RoleId (1-4)。这应该作为一行返回,而不是 userId 1 与每个 roleId 的多行。
      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多