C# 返回列表中角色id为的所有用户

C# 返回列表中角色id为的所有用户,c#,entity-framework,C#,Entity Framework,我有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

我有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; }
}

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

更新 我知道为什么。。我的代码是正确的。Mapper类中有错误。
我使用了类似.FirstOrDefault().RoleId的东西。所以它只返回第一个数据,一个用户可能有多个角色!谢谢大家

试着往回走,看看这是否有帮助

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

听起来您正试图从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;

如果不想将导航属性添加到
用户
角色
,可以使用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();

那么,结果如何?是的,你是对的,这个问题没有多大意义。但您可能希望对两个/三个表进行联接,这在Linq中可用。我的结果包含roleId==1的记录。请注意,
Roles
没有指向
User
UserRoles
的导航属性,因此您必须将其添加到答案中。
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();