2011-01-14 59 views
4

好吧例如,我使用逐像這樣的:星期一= 1,星期二= 2,星期三= 4,星期四= 8等等C#EF Linq的按位問題

我使用的是實體框架類的商業。

我正在使用一個類並傳入一個像7(星期一,星期二,星期三)的值。

我要返回匹配任何的那些日子

public List<Business> GetBusinesses(long daysOfWeek) 
    { 
     using (var c = Context()) 
     { 
       return c.Businesses.Where(???).ToList(); 
     } 
    } 

任何幫助,將不勝感激的記錄。謝謝!

編輯

好了,我試圖如下:

var b = new List<Business>(); 
var b1 = new Business(){DaysOfWeek = 3}; 
b.Add(b1); 
var b2 = new Business() { DaysOfWeek = 2 }; 
b.Add(b2); 
var decomposedList = new[]{1}; 
var l = b.Where(o => decomposedList.Any(day => day == o.DaysOfWeek)).ToList(); 

但升返回0結果假設在decomposedList(1)我找星期一。 我創建了b1來包含星期一和星期二。

+1

而EF列的Int32 – Cyberdrew 2011-01-14 21:34:53

+0

請這樣不存儲數據在*關係*數據庫。你想在對象空間中做到這一點,很好,但...。 – 2011-01-14 22:29:51

回答

4

使用按位和運算符&將所需標誌與數據庫中的實際標誌組合起來,然後檢查非零結果。

 var b1 = new { DaysOfWeek = 3 }; 
     var b2 = new { DaysOfWeek = 2 }; 
     var b = new[] { b1, b2 }; 
     var filter = 1; 

     var l = b.Where(o => (filter & o.DaysOfWeek) != 0); 
     foreach (var x in l) 
     { 
      Console.WriteLine(x); 
     } 

如果你有過濾器值只是用OR |第一再組合的數組:

 var filterArray = new []{1, 4}; 
     var filter = filterArray.Aggregate((x, y) => x | y); 
1

您必須分解長值(bitflagged枚舉會更好),以它的零件,然後將它傳遞給Where

return c.Businesses.Where(o=> DecomposeDays(dayParam).Any(day => day==o)).ToList(); 

編輯: 分解方法:

private static IEnumerable<byte> DecomposeDays(byte dayParam) 
{ 
    var daysOfWeek = new List<byte> { 1, 2, 4, 6, 8 ,16}; 
    return daysOfWeek.Where(o => (o & dayParam) == dayParam); 
} 
+0

我是一個noob。你能解釋一下如何分解多頭? – Cyberdrew 2011-01-14 21:45:50