【问题标题】:Return all users with role id in a list返回列表中具有角色 id 的所有用户
【发布时间】:2018-05-01 20:43:44
【问题描述】:

我有 3 个表:User、Roles 和 UserRoles,并且我有一个角色 ID 列表 { 2, 3, 4 }。我想返回所有 id 为 2、3 或 4 的用户。

型号:

public partial class User
{
    public int Id { get; set; }
    public virtual ICollection<UserRoles> UserRoles { get; set; }
}

public partial class Roles
{
    public int Id { get; set; }
}

public partial class UserRoles
{
    public int UserId { get; set; }
    public int RoleId { get; set; }

    public virtual Users Users { get; set; }
    public virtual Roles Roles { get; set; }
}

还有我的代码:

int[] RoleIds = { 2, 3, 4 };
return await _dbContext.Users
    .Where(u => u.UserRoles.Any(x=> RoleIds.Contains(x.RoleId)));

我不知道为什么,但我的结果包含 roleId == 1 的记录。

更新

我知道为什么.. 我的代码是正确的。 Mapper 类有问题。 我使用了类似 .FirstOrDefault().RoleId 的东西。所以它只返回第一个数据,并且一个用户可能有多个角色!谢谢各位

【问题讨论】:

  • aand,这是什么结果?
  • 是的,你是对的,这个问题没有多大意义。但是您可能希望在 Linq 中提供两个/三个表的连接。
  • 我的结果包含 roleId == 1 .. 的记录

标签: c# entity-framework


【解决方案1】:

尝试倒退看看是否有帮助...

return await _dbContext.UserRoles
     .Where(r => RoleIds.Contains(r.RoleId))
     .Select(r => r.Users)

【讨论】:

  • 请注意,Roles 没有指向 UserUserRoles 的导航属性,因此您必须将其添加到您的答案中。
【解决方案2】:

如果您不想将导航属性添加到 UserRoles,您可以使用 LINQ 查询语法轻松地做到这一点:

var usersQuery = from role in _dbContext.Roles
                 join userRole in _dbContext.UserRoles 
                     on role.Id equals userRole.RoleId
                 join user in _dbContext.Users
                     on userRole.UserId equals user.Id;
                 where roleIds.Contains(role.Id)
                 select user;

var users = usersQuery.ToList();

【讨论】:

    【解决方案3】:

    听起来您正试图从 UserRole 关系表中获取用户。

    下面是如何在查询表达式语法中做到这一点:

    int[] RoleIds = { 2, 3, 4 }; 
    
    var users = from ur in _dbContext.UserRoles
                where RoleIds.Contains(ur.RoleId)
                select ur.Users;
    

    或者,如果您不想要或没有导航属性:

    int[] RoleIds = { 2, 3, 4 }; 
    
    var users = from ur in _dbContext.UserRoles
                where RoleIds.Contains(ur.RoleId)
                join user in _dbContext.Users
                on ur.UserId equals user.Id
                select user;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2019-12-11
      • 2023-03-21
      • 2017-10-29
      相关资源
      最近更新 更多