我有一个枚举类型象下面
[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();
我打算做一个猜测,你是不知道要放什么东西在查询中筛选出您在源列表中的天。
鉴于你的源代码片段,我认为它的安全推断dwInt被用作位掩码,和星期几将有一个位位置“设置”,表示一周的某一天。 在此基础上,你想要做的是在哪里进行逻辑按位上的星期几场dwInt,然后检查结果是大于0,这意味着本周的“位”所需一天一个设在你的目标领域。 我相信这会做的伎俩:
var list = query.Where(f => (f.FromDateTime.DayOfWeek & dwInt) >0).ToList()
请原谅,如果我没有正确理解你的问题。
从实体框架6.1开始,您可以使用HasFlag
在您的要求扩展方法。
例如:
query.Where(f => f.FromDateTime.DayOfWeek.HasFlag(WeekDays.Friday | WeekDays.Monday)).ToList();
见https://entityframework.codeplex.com/workitem/1497有关的功能要求和实施细则。
[HasFlags]属性在某种意义上是非常有趣的,它不会影响任何东西,但的ToString()和(据我所知)Enum.Parse()操作。 因此,对于非字符串操作,这不要紧,你的枚举类型是否有[HasFlags]属性。 枚举在EF的工作方式是,他们只投为基础类型,它们好像是下面的积分类型INT64,INT32,INT16,字节,为sbyte一个被处理(注无符号整型不会被电火花,因此支持无符号基础类型枚举将不工作,并且也可在数据库枚举列都只是对应于上述类型之一)的类型的列。 这意味着,基本上可以认为是有效的整数值(由EF支持的类型)的任何操作上的枚举值有效,除非编译器不允许它(我不认为我知道像这样的任何操作)。 这也意味着,无论你希望把您的???? 是如果它编译应该工作(SQL Server支持位运算)
解决方案是在这里
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))));