2012-04-25 165 views
4

我有一个枚举类型像下面在实体框架查询

[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(); 
+4

您是否知道您没有问过任何问题? – usr 2012-04-25 19:34:18

+5

我写过???????????我能在那里做什么? – tobias 2012-04-25 19:52:14

+8

@tobias不要把你的问题放在代码本身,特别是当我们需要滚动以找到它时。 – Sampson 2012-04-25 19:56:27

回答

2

的解决方案是在这里

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)))); 
8

我打算做一个猜测,你是不知道要放什么东西在查询过滤使用带有国旗的枚举你在源代码中列出的日子。

鉴于您的源代码片段,我认为它可以安全地推断dwInt被用作位掩码,并且DayOfWeek将有一个位置“set”来指示给定的星期几。在此基础上,您要做的是在Where执行逻辑按位与DayOfWeek字段中使用dwInt,然后检查结果是否大于0,表示期望的星期几“位”之一设置为你的目标领域。我相信这会做伎俩:

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

请原谅,如果我不正确地解释你的问题。

+1

请注意,这不适用于实体框架查询,因为它不会转换为SQL。你将不得不调用'ToList()'并对结果内存中的集合执行'Where()'。 – jrummell 2012-04-25 20:00:33

+0

为我使用EF 5,.NET 4.5没有.ToList() – 2013-07-31 23:29:22

6

[HasFlags]属性在某种意义上非常有趣,它不会影响除.ToString()和(AFAIK)Enum.Parse()操作之外的任何内容。因此,对于非字符串操作,枚举类型是否具有[HasFlags]属性无关紧要。枚举在EF中的工作方式是,它们只是转换为基础类型,并被视为它们是以下整型之一int64,int32,int16,byte,sbyte(注意EDM不支持无符号整型类型,因此带有未签名基础类型的枚举不起作用,而且在数据库中,枚举列也只是与上述类型对应的类型的列)。这意味着,除非编译器不允许它(我不认为我知道这样的任何操作),基本上对整数值(EF支持的类型)有效的任何操作对枚举值都是有效的。 这也意味着,无论你想放哪里你????是如果它编译(SQL Server支持位运算)应该工作

6

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

例如:

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

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