2011-01-14 72 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