检查用户是否存在并返回用户+角色EF6

时间:2019-04-09 09:54:01

标签: c# entity-framework-6

我试图弄清楚如何使用Any检索角色并检查用户是否存在于同一查询中,并以SingleOrDefault()返回但似乎不起作用。

private User Authenticate(LoginViewModel model)
{
     using (HutLogisticaContext context = new HutLogisticaContext())
     {
         return context.Users.Where(u => u.Username.Contains(model.Username)).SingleOrDefault();
     }
}

但是,如果我添加Any,它不会让添加单个或默认值。我该如何在同一个查询中同时执行这两项?

编辑

我忘了提及,但是我想返回带有所有与之相关的角色的用户对象,不确定是否没有导航属性是否可能,因为我无法使用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,因此这会自动创建UserId和RoleId为PK和FK的联接表

2 个答案:

答案 0 :(得分:1)

由于您的用户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);

答案 1 :(得分:1)

在对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(); 
    } 
}