标记枚举 属性 where 子句不影响 entity framework 核心中的 sql 查询
flags enum property where clause not affect on sql query in entity framework core
为了给用户分配多种类型,我使用用 Flags 属性装饰的 UserType 枚举作为休闲:
[Flags]
public enum UserType
{
Default = 0,
Moderator = 1,
Doctor = 2,
Administrator = 4,
}
public class User : IdentityUser
{
public bool Suspended { get; set; }
public bool Deleted { get; set; }
public UserType UserType { get; set; }
}
并将userType分配给用户,
user.UserType = UserType.Moderator | UserType.Administrator;
当下面的查询运行时,
var t = dbContext.Users.Where(e => e.UserType.HasFlag(UserType.Doctor)).ToList();
这个sql查询生成,可以看出查询中没有where表达式的踪迹。然而,ef查询结果没问题,但问题是所有用户加载到内存并且数据库中没有过滤器,确实查询发生在内存中
SELECT [e].[Id], [e].[PasswordHash], [e].[PhoneNumber], [e].[PhoneNumberConfirmed]
, [e].[SecurityStamp], [e].[Suspended], [e].[TwoFactorEnabled],[e].[UserName], [e].[UserType]
FROM [AspNetUsers] AS [e]
ef 6 中不存在此问题。
此问题之前已在 Github 中提出,并于 2015 年 8 月 19 日将其添加到 Backlog 里程碑中,但现在不受支持
为了给用户分配多种类型,我使用用 Flags 属性装饰的 UserType 枚举作为休闲:
[Flags]
public enum UserType
{
Default = 0,
Moderator = 1,
Doctor = 2,
Administrator = 4,
}
public class User : IdentityUser
{
public bool Suspended { get; set; }
public bool Deleted { get; set; }
public UserType UserType { get; set; }
}
并将userType分配给用户,
user.UserType = UserType.Moderator | UserType.Administrator;
当下面的查询运行时,
var t = dbContext.Users.Where(e => e.UserType.HasFlag(UserType.Doctor)).ToList();
这个sql查询生成,可以看出查询中没有where表达式的踪迹。然而,ef查询结果没问题,但问题是所有用户加载到内存并且数据库中没有过滤器,确实查询发生在内存中
SELECT [e].[Id], [e].[PasswordHash], [e].[PhoneNumber], [e].[PhoneNumberConfirmed]
, [e].[SecurityStamp], [e].[Suspended], [e].[TwoFactorEnabled],[e].[UserName], [e].[UserType]
FROM [AspNetUsers] AS [e]
ef 6 中不存在此问题。
此问题之前已在 Github 中提出,并于 2015 年 8 月 19 日将其添加到 Backlog 里程碑中,但现在不受支持