C # EF Linq побитовый вопрос - PullRequest
7 голосов
/ 15 января 2011

Хорошо, например, я использую поразрядно, например: понедельник = 1, вторник = 2, среда = 4, четверг = 8 и т. Д. *

Я использую бизнес-класс 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(); 

Но l возвращает 0 результатов, предполагая, что в demposedList (1) я ищу понедельник,Я создал b1, чтобы содержать понедельник и вторник.

Ответы [ 2 ]

8 голосов
/ 15 января 2011

Используйте побитовое и оператор &, чтобы объединить нужные флаги с фактическими флагами в базе данных, а затем проверить ненулевой результат.

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

Если у вас есть массив значений фильтразатем просто объединяется с ИЛИ |:

        var filterArray = new []{1, 4};
        var filter = filterArray.Aggregate((x, y) => x | y);
1 голос
/ 15 января 2011

Вы должны разложить длинное значение (перечисление с битовой меткой будет лучше) на его части, а затем передать его Where

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

EDIT: метод разложения:

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