2015-01-17 2 views
1

Я хочу построить динамическое предложение Linq Where, с несколькими || (ОШ), основанные на пользователя проверяется Флажкипостроить динамический linq где из отмеченных ящиков

мне нужны фильтры, чтобы быть || s - не & & s

Пример:

автомобиля: Автомобиль, внедорожник, грузовик

Цвет : черный, синий, серебристый, белый

двигателя: V4, V6, V8

var query = from v in vehicles 
      where 
       (v.Vehicle == "Car" && v.Color == "Blue") 
       || (v.Vehicle == "Truck" && v.Engine == "V8") 
       || (v.Vehicle == "Car" && v.Engine == "V4") 
      select v; 

Как создать/добавить несколько фильтров с помощью || оператор?

Я смотрел на ScottGu и PredicateBuilder ... но не мог понять, как заставить его работать

Я все еще учусь Linq

+0

ли Вы хотите запросить ваша БД? Какова ваша текущая привязка предикатов? – user3411327

ответ

0

Используя функциональный синтаксис, это можно сделать с помощью следующих двух строк :

var CheckedColors = this.Controls.OfType<CheckBox>().Where(c => c.Checked).Select(c => c.Text).ToArray(); 
var CheckedVehicles = vehicles.Where(v => CheckedColors.Contains(v)); 

Приведенный выше код предполагает, что ваши флажки имеют тот же Text как цвета вы запрашивая против. Та же логика может быть расширена и для запросов к типам двигателей.

Исключение: первая строка фильтрует все флажки в форме, а затем создает проекцию свойства «Текст» каждого установленного флажка. Вторая строка затем фильтрует ваши транспортные средства, которые присутствуют в этом списке.

1

Создать массив предикатов. Каждый предикат проверяет особое условие: синий автомобиль, грузовик или V8 V4 автомобиля и т.д. Управление содержимым массива и использовать его как это:

delegate bool CheckVehicle(dynamic v); // predicate template 

private static bool CheckCarBlue(dynamic v) 
{ 
    return v.Vehicle == "Car" && v.Color == "Blue"; 
} 

private static bool CheckTruckV8(dynamic v) 
{ 
    return v.Vehicle == "Truck" && v.Engine == "V8"; 
} 

private static bool CheckCarV4(dynamic v) 
{ 
    return v.Vehicle == "Car" && v.Engine == "V4"; 
} 

где-то в коде:

List<CheckVehicle> checks = new List<CheckVehicle>(); 
checks.Add(CheckCarBlue); 
checks.Add(CheckTruckV8); 
checks.Add(CheckCarV4); 

var Q = from v in vehicles 
     where checks.Any<CheckVehicle>(p => p(v)) 
     select v; 
Смежные вопросы