如何使用基于位枚举的参数从实体框架返回值

本文关键字:实体 框架 返回值 参数 何使用 于位 枚举 | 更新日期: 2023-09-27 18:29:08

Bit(抱歉)对如何在Entity Framework中使用位运算符感到困惑。

最近的一个要求是,我们必须将一个枚举从一系列顺序整数更改为逐位枚举。因此:

[Flags]
public enum AdminLevel
{
    None = 0,
    Basic = 1,
    Partial = 2,
    Full = 4
} 

我们最初将其作为int列存储在数据库中。当然,它仍然是一个int,但我很难理解如何基于多个可能的枚举值执行选择。例如,此代码:

public string GetAdminEmails(AdminLevel adminlevel)
{
    using (IRepository r = Rep.Renew())
    {
        string[] to = r.GetUsers().Where(u => u.AdminLevel >= (int)adminlevel).Select(u => u.Email).ToArray();
        return string.Join(",", to);
    }
}

将返回所有管理级别,包括提供的管理级别及以上的管理级别。如果我想要一个以上的管理级别,我现在必须这样称呼它:

GetAdminEmails(AdminLevel.Partial | AdminLevel.Full);

但很明显,我无法将其转换为int并使用大于。有没有比一系列流控制语句更整洁的方法来处理这种更改?

如何使用基于位枚举的参数从实体框架返回值

您可以使用HasFlag方法:

AdminLevel myFlags = AdminLevel.Partial | AdminLevel.Full;
string s = GetAdminEmails(myFlags);
public string GetAdminEmails(AdminLevel myFlags)
{
  using (IRepository r = Rep.Renew())
  {
      string[] to = r.GetUsers().Where(u => u.AdminLevel.HasFlag(myFlags))
                                .Select(u => u.Email).ToArray();
      return string.Join(",", to);
  }
}

您可以将数据库中的int列定义为模型中的枚举:

public enum MyEnum : int { First = 0, Second = 1}
public partial class MyModel
{
   public MyEnum Type {get; set;}
}

在整个应用程序中,您只需使用MyEnum,EF将在后台使用int