C# EF Linq bitwise question

前端 未结 2 877
北恋
北恋 2021-02-06 04:01

Ok for example, I am using bitwise like such: Monday = 1, Tuesday = 2, Wednesday = 4, Thursday = 8 etc...

I am using an Entity Framework class of Business.

I am

相关标签:
2条回答
  • 2021-02-06 04:54

    Use the bitwise and operator & to combine your desired flags with the actual flags in the database and then check for a non-zero result.

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

    If you have an array of filter values simply combined then with an OR | first:

            var filterArray = new []{1, 4};
            var filter = filterArray.Aggregate((x, y) => x | y);
    
    0 讨论(0)
  • 2021-02-06 04:57

    You must decompose the long value(bitflagged enum will be better) to it's parts then pass it to Where

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

    EDIT: decompose method:

    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 讨论(0)
提交回复
热议问题