2014-11-17 4 views
0

У меня есть следующий запрос linq. Я хочу указать условие в where как строку, поскольку я сделаю ее пустой, когда у меня не будет никаких условий. Но при этом я получаю ошибка: «Cant явно конвертирует строку в bool« Я знаю причину ошибки. Я просто хочу знать, есть ли другая альтернатива для реализации следующего.using string как условие в LINQ

var elements = from element in array 
       orderby element descending 
       where element > 2 
       select element; 

Строка состояния = "элемент>" + 2;

Я хочу сделать следующее ....

var elements = from element in array 
       orderby element descending 
       where condition<------------    
          select element; 

PS: Я буду справиться с ситуацией, когда нет условия и где положение остается без условия.

Заранее спасибо ...

+2

Использование DynamicLinq (http://dynamiclinq.codeplex.com/). – haim770

ответ

1

Вы можете разделить это условие в два, как

var elements = array.OrderByDescending(o => o); 
    if (put some condition for active where) 
     elements= elements.Where(o=>o>2); 
1

синтаксис запроса переводится в обычный синтаксис компилятором, так что ваш пример эквивалентен:

var elements = array.OrderByDescending(element => element).Where(element => element > 2); 

Оба OrderByDescending и Where возвращают IEnumerable<T>. То, что Where делает, вставляет в качестве фильтра Func<T, bool>, поэтому, когда вы перебираете перечислимый, он вызывает эту функцию для каждого элемента и пропускает элемент, если функция возвращает false. Если вы не имеете условия, вы можете просто оставить из призыва Where:

var elements = array.OrderByDescending(element => element); 

Если позднее, вы должны выбрать только определенные элементы, вы можете применить фильтр к элементам:

elements = elements.Where(element => element > 2); 

Если фильтр зависит от пользовательского ввода, вы можете использовать замыкание (функции, которые захватывают внешние переменные):

public Func<int, bool> CreateFilter(int value) 
{ 
    // This returns a function that 'remembers' the given value: 
    return element => element > value; 
} 

, который затем может быть использован как:

int userInput = 5; 
elements = array.OrderByDescending(element => element).Where(CreateFilter(userInput));