标记枚举 属性 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 里程碑中,但现在不受支持