如何使用基于按位枚举的参数从 Entity Framework return 值
How to return values from Entity Framework with parameters based on a bitwise Enum
有点(抱歉)对如何在 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);
}
}
return 所有管理员级别,包括提供的级别和更高级别。如果我想要一个以上的管理员级别,我现在必须这样称呼它:
GetAdminEmails(AdminLevel.Partial | AdminLevel.Full);
但显然我不能将其转换为 int 并使用 greater than any more。有没有比一系列流程控制语句更简洁的方法来处理此更改?
您可以使用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
。
有点(抱歉)对如何在 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);
}
}
return 所有管理员级别,包括提供的级别和更高级别。如果我想要一个以上的管理员级别,我现在必须这样称呼它:
GetAdminEmails(AdminLevel.Partial | AdminLevel.Full);
但显然我不能将其转换为 int 并使用 greater than any more。有没有比一系列流程控制语句更简洁的方法来处理此更改?
您可以使用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
。