C# EF Linq 位运算问题

11

比如说,我正在像这样使用位运算:星期一=1、星期二=2、星期三=4、星期四=8等等...

我正在使用一个名为Business的Entity Framework类。

我正在使用一个类并传入一个值,比如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(); 

但是,假设我在decomposedList(1)中寻找星期一,l返回0个结果。我创建了b1来包含星期一和星期二。


请不要以这种方式在关系型数据库中存储数据。如果您想在对象空间中执行此操作,那很好,但是... - Craig Stuntz
2个回答

12
使用位运算符&将所需标志与数据库中的实际标志组合,然后检查是否存在非零结果。
        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);

好的,我喜欢这个,但如果过滤器是一个数组,我该怎么做呢?例如:var filter = []{1,2} - Cyberdrew
首先,将数组中的值简单地使用 OR (|) 运算符进行合并,因为您希望其中任何一个值都可以。例如,1 | 2 的结果是 3。您也可以在 Where 子句中使用另一个 .Any 子句,但是先进行或运算更加高效。 - Ian Mercer

1

你必须将长整型值(使用位标志枚举更好)分解为其部分,然后将其传递给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);
}

我是一个新手。你能解释一下如何分解long吗? - Cyberdrew
如果您无法提供完整的解决方案,我将为您提供一个完整的可行答案。 - Jahan Zinedine
我猜我想知道如何在不使用switch case或类似的东西的情况下从长的daysOfWeek属性创建分解列表。 - Cyberdrew
好的,谢谢,我只是不知道是否有更简洁的方法。 - Cyberdrew
1
这在使用Linq to Entities是行不通的 - SQL怎么知道如何处理'DecomposeDays'呢? - Ian Mercer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接