2012-04-25 299 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