检查用户是否存在以及 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(); 
    } 
}