C# 返回列表中角色id为的所有用户
我有3个表:User、Roles和UserRoles,我有一个角色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
{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();