C # EF Linq bitwise question

Ok, for example, I use bitwise: Monday = 1, Tuesday = 2, Wednesday = 4, Thursday = 8, etc.

I am using the Entity Framework class for Business.

I use a class and pass a value like 7 (Monday, Tuesday, Wednesday).

I want to return records matching any of these days

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

Any help would be greatly appreciated. Thanks!

EDIT

So, I am trying to do the following:

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

But l returns 0 results accepted in decposedList (1) I'm looking for monday. I created b1 to contain Monday and Tuesday.

+4
source share
2 answers

Use the bitwise and the & operator to combine the 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 ​​that are simply concatenated, then with OR | :

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

You have to decompose the long value (bitflagged enum would be better) into parts of it, and then pass it to Where

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

EDIT: decomposition 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); } 
+1
source

Source: https://habr.com/ru/post/1335614/


All Articles