我试图弄清楚如何使用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的联接表
答案 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();
}
}