2015-09-30 2 views
2

Как бы вы цепочки «Where» в linq в соответствии с различными состояниями переменных. E, g; (21-30, 31-40, 41-50, 51-60, 60>)Цепочка Linq Where clauses

У нас есть List<People> «Люди», и мы должны отфильтровать его в соответствии с отмеченными ячейками. Если предположить, что список не может быть просто IEnumerable, как это было оценено

Помимо этого делать:

List<People> filteredPeople = new List<people>(); 
if(CB1.checked) 
    filteredPeople = filteredPeople.Union(People.Where(inTheirTwenties)) //assuming method inTheir20s filters correct 
if(CB2.checked) 
    filteredPeople = filteredPeople.Union(People.Where(inTheirThirties)) ; 
//...and so on 

есть лучший способ обойти это?

+1

Почему 'Union'? Вы можете непосредственно применить метод 'Where'' filterPeople = filtPeople.Where (p => p.Age> = 21 && p.Age <= 30) ' –

+0

В списке реализована' IEnumerable', на самом деле есть очень коллекции представлений что нет. Таким образом, он может и есть ли он был оценен или нет. Вы думаете о 'IQueryable' –

+0

Этот код только что сломан. Проверка CB1 и CB2 не вернет оба 20 и 30 секунд. Поскольку вы меняете 'filtersPeople' между вызовами. Фактически, ваш код в настоящее время возвращает ВСЕ людей «независимо». – Aron

ответ

6

Я бы связать все это вверх в один Where заявление и обновить inTheirTwenties методы взять отдельного человека, как это:

filteredPeople.Where(x => (CB1.checked && inTheirTwenties(x)) 
|| (CB2.checked && inTheirThirties(x)) ...); 
+0

Это не работает, если мы можем проверить несколько флажков? – tichra

+1

@tichra Он должен делать, поскольку мы оцениваем только один объект за раз, передавая x в метод inTheirTwenties, и мы комбинируем различные проверки с помощью '||' s – TomDoesCode

+0

, спасибо, и если ничего не проверено, я предполагаю, что он вернется пустой, а не все? – tichra

2

Цепной неизвестное количество .Where() положений, которые используют OR может привести к многословным и трудно читать код. К счастью, в вашем сценарии вы можете инвертировать это в ряд выражений AND, которые представляют гораздо более читаемую партию кода.

var filteredPeople = new List<Person>(); 

if(!checkBox1) filteredPeople = filteredPeople.Where(p => !inTheirTwenties(p)); 
if(!checkBox2) filteredPeople = filteredPeople.Where(p => !inTheirThirties(p)); 

Если бы этот запрос LINQ к SQL этого типа кода будет также упростить то, что идет через к базе данных, сделав элегантный ИНЕК без ряда true и false направляются по проводам. Конечно, вы не могли бы использовать inTheirTwenties(Person) для доступа к SQL Server, но вместо этого сделать что-то вроде:

filteredPeople.Where(p => !(p.Age >= 21 && p.Age <=30)); 
Смежные вопросы