2011-01-14 3 views
4

Ok, например, я использую побитовые как например: понедельник = 1, вторник = 2, среду = 4, четверг = 8 и т.д. ...C# EF Linq побитового вопрос

Я использую класс Entity Framework в Бизнес.

Я использую класс и передаю его как 7 (понедельник, вторник, среда).

Я хочу вернуться записи, которые соответствуют любой из этих дней

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

Любая помощь будет оценена. Благодаря!

EDIT

Хорошо, так что я пытаюсь следующее:

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

+0

Пожалуйста, не хранить данные таким образом в * реляционная * база данных. Вы хотите сделать это в пространстве объектов, отлично, но ... –

ответ

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); 
+0

Как вы это делаете? – Cyberdrew

+0

См. Редактирование, показывающее, как это сделать. –

+0

Хорошо, мне это нравится, но как это сделать, если фильтр - это массив? Пример: var filter = [] {1,2} – Cyberdrew

1

Вы должны распадаться длинное значение (bitflagged перечисление будет лучше), чтобы его детали затем передать его 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); 
} 
+0

Я ном. Не могли бы вы объяснить, как разложить долго? – Cyberdrew

+0

http://www.abhisheksur.com/2010/10/make-your-enumeration-to-bit-flags.html –

+0

если yo не может прийти с полным решением, я предоставляю вам полный рабочий ответ –