在实体框架查询中使用与国旗的枚举(Using a enum with flag in an Enti

2019-09-16 18:28发布

我有一个枚举类型象下面

  [Flags]
    public enum WeekDays
    {

        Monday = 1,
        Tuesday = 2,
        Wednesday = 4,
        Thursday = 8,
        Friday = 16,
        Saturday = 32,
        Sunday = 64,
    }


   WeekDays dw = WeekDays.Friday | WeekDays.Monday | WeekDays.Saturday;

   int dwInt = (int)dw;

   var list = query.Where(f => f.FromDateTime.DayOfWeek == dwInt "??????????? what can i do there????").ToList();

Answer 1:

我打算做一个猜测,你是不知道要放什么东西在查询中筛选出您在源列表中的天。

鉴于你的源代码片段,我认为它的安全推断dwInt被用作位掩码,和星期几将有一个位位置“设置”,表示一周的某一天。 在此基础上,你想要做的是在哪里进行逻辑按位上的星期几场dwInt,然后检查结果是大于0,这意味着本周的“位”所需一天一个设在你的目标领域。 我相信这会做的伎俩:

var list = query.Where(f => (f.FromDateTime.DayOfWeek & dwInt) >0).ToList()

请原谅,如果我没有正确理解你的问题。



Answer 2:

从实体框架6.1开始,您可以使用HasFlag在您的要求扩展方法。

例如:

query.Where(f => f.FromDateTime.DayOfWeek.HasFlag(WeekDays.Friday | WeekDays.Monday)).ToList();

见https://entityframework.codeplex.com/workitem/1497有关的功能要求和实施细则。



Answer 3:

[HasFlags]属性在某种意义上是非常有趣的,它不会影响任何东西,但的ToString()和(据我所知)Enum.Parse()操作。 因此,对于非字符串操作,这不要紧,你的枚举类型是否有[HasFlags]属性。 枚举在EF的工作方式是,他们只投为基础类型,它们好像是下面的积分类型INT64,INT32,INT16,字节,为sbyte一个被处理(注无符号整型不会被电火花,因此支持无符号基础类型枚举将不工作,并且也可在数据库枚举列都只是对应于上述类型之一)的类型的列。 这意味着,基本上可以认为是有效的整数值(由EF支持的类型)的任何操作上的枚举值有效,除非编译器不允许它(我不认为我知道像这样的任何操作)。 这也意味着,无论你希望把您的???? 是如果它编译应该工作(SQL Server支持位运算)



Answer 4:

解决方案是在这里

 public static Dictionary<int, int> map = new Dictionary<int, int>() { { 0, 64 }, { 1, 1 }, { 2, 2 }, { 3, 4 }, { 4, 8 }, { 5, 16 }, { 6, 32 } };

//actually,this gets from a user interface,but we shoul be focus database layer
WeekDays[] dw = new WeekDays[] {WeekDays.Saturday,WeekDays.Tuesday,WeekDays.Wednesday };

int[] systemDayOfWeekList = new int[daysOfWeek.Length];

for (int i = 0; i < daysOfWeek.Length; i++)
{
  systemDayOfWeekList[i] = map.FirstOrDefault(e => e.Value == (int)daysOfWeek[i]).Key;
}

query = query.Where(f => dayOfWeekList.Contains(((int)SqlFunctions.DatePart("dw", f.FromDateTime))));


文章来源: Using a enum with flag in an Entity Framework query