检查用户是否存在以及 return 用户 + 角色 EF6
Check if user exists and return user + roles EF6
我正在尝试弄清楚如何使用 Any 检索角色并检查用户是否存在于同一查询中并且 return 与 SingleOrDefault() 但似乎不起作用。
private User Authenticate(LoginViewModel model)
{
using (HutLogisticaContext context = new HutLogisticaContext())
{
return context.Users.Where(u => u.Username.Contains(model.Username)).SingleOrDefault();
}
}
但是,如果我添加 Any,它不会让 met 添加单个或默认值。我怎样才能在同一个查询中同时执行这两项操作?
编辑
我忘了提及,但我想 return 用户对象及其相关的所有角色,不确定没有导航是否可行 属性 因为我无法使用 include
public class Role
{
public int Id { get; set; }
public string Nome { get; set; }
public ICollection<User> Users { get; set; }
public ICollection<Claim> Claims { get; set; }
}
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public DateTime? DataSessao { get; set; }
public bool IsActivo { get; set; }
public virtual Colaborador Colaborador { get; set; }
public ICollection<Role> Roles { get; set; }
public ICollection<App> Apps { get; set; }
}
我正在使用 EF 6,所以这会自动创建连接 table,其中 UserId 和 RoleId 作为 PK 和 FK
由于您的用户 EF 实体已经将角色关联设置为导航集合 属性,即
public class User
{
...
public ICollection<Role> Roles { get; set; }
...
当您检索用户时,您可以使用告诉 EF 预先加载此导航:
return context.Users
.Include(u => u.Roles) // << i.e. Force EF to Join the UserRoles assocated with User
.Where(...)
.SingleOrDefault()
在调用方法中,您现在可以访问 user.Roles
,或使用您的 user.Roles.Any()
逻辑来查看用户是否具有该角色等。
还有一些其他的事情
- 由于用户名在系统中似乎应该是唯一的,Contains
(映射到 SQL IN
)在这里似乎是错误的工具。我会进行直接比较,特别是如果您在 User.UserName
列上使用默认的不区分大小写的排序规则。
- SingleOrDefault 也有一个重载,允许使用与 Where
过滤器相同的谓词,因此您可以将其简化为:
return context.Users
.Include(u => u.Roles)
.SingleOrDefault(u => u.UserName == model.Username);
经过对 chat 的长时间讨论,以下代码适用于 OP。
private User Authenticate(LoginViewModel model)
{
using (HutLogisticaContext context = new HutLogisticaContext())
{
return context.Users
.Include(u => u.Roles)
.Where(u => u.Id == 123)
.SingleOrDefault();
}
}
我正在尝试弄清楚如何使用 Any 检索角色并检查用户是否存在于同一查询中并且 return 与 SingleOrDefault() 但似乎不起作用。
private User Authenticate(LoginViewModel model)
{
using (HutLogisticaContext context = new HutLogisticaContext())
{
return context.Users.Where(u => u.Username.Contains(model.Username)).SingleOrDefault();
}
}
但是,如果我添加 Any,它不会让 met 添加单个或默认值。我怎样才能在同一个查询中同时执行这两项操作?
编辑
我忘了提及,但我想 return 用户对象及其相关的所有角色,不确定没有导航是否可行 属性 因为我无法使用 include
public class Role
{
public int Id { get; set; }
public string Nome { get; set; }
public ICollection<User> Users { get; set; }
public ICollection<Claim> Claims { get; set; }
}
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public DateTime? DataSessao { get; set; }
public bool IsActivo { get; set; }
public virtual Colaborador Colaborador { get; set; }
public ICollection<Role> Roles { get; set; }
public ICollection<App> Apps { get; set; }
}
我正在使用 EF 6,所以这会自动创建连接 table,其中 UserId 和 RoleId 作为 PK 和 FK
由于您的用户 EF 实体已经将角色关联设置为导航集合 属性,即
public class User
{
...
public ICollection<Role> Roles { get; set; }
...
当您检索用户时,您可以使用告诉 EF 预先加载此导航:
return context.Users
.Include(u => u.Roles) // << i.e. Force EF to Join the UserRoles assocated with User
.Where(...)
.SingleOrDefault()
在调用方法中,您现在可以访问 user.Roles
,或使用您的 user.Roles.Any()
逻辑来查看用户是否具有该角色等。
还有一些其他的事情
- 由于用户名在系统中似乎应该是唯一的,Contains
(映射到 SQL IN
)在这里似乎是错误的工具。我会进行直接比较,特别是如果您在 User.UserName
列上使用默认的不区分大小写的排序规则。
- SingleOrDefault 也有一个重载,允许使用与 Where
过滤器相同的谓词,因此您可以将其简化为:
return context.Users
.Include(u => u.Roles)
.SingleOrDefault(u => u.UserName == model.Username);
经过对 chat 的长时间讨论,以下代码适用于 OP。
private User Authenticate(LoginViewModel model)
{
using (HutLogisticaContext context = new HutLogisticaContext())
{
return context.Users
.Include(u => u.Roles)
.Where(u => u.Id == 123)
.SingleOrDefault();
}
}