2016-12-20 2 views
0

Мне нужно написать запрос LINQ для возвращаемого списка, который принимает несколько необязательных параметров. Там будут следующие переменные:Запрос LINQ Filter с несколькими необязательными параметрами

план, Id, FirstName, LastName, DateFrom, DateTo, MemDateOfBirth

Я хочу вернуть отфильтрованный список обратно через LINQ с использованием этих параметров, но все из них являются необязательными. По крайней мере один будет предоставлен, когда пользователь нажимает кнопку поиска, но это зависит от пользователя, чтобы решить, к чему они хотят выполнить поиск. Если они поставляют более 1, мне нужно фильтровать все методы, которые они поставляют ...

Так, например, если они предоставляют первое имя и от дат, я хочу вернуть отфильтрованный список всех экземпляров для человек по этому имени между датами и датами и т. д.

Что такое самый простой способ выполнить это с помощью LINQ? Эти переменные являются необязательными параметрами, поэтому любой или все из них могут быть предоставлены. Я знаю, что могу вернуть основной список, а затем фильтровать его несколько раз, чтобы получить результаты, но мне было интересно, есть ли более быстрый и простой способ сделать это через LINQ ...

заблаговременно за вашу помощь !

+4

Я просто иметь несколько 'Where' звонки внутри' заявлений if'. – juharr

ответ

0

Вы можете использовать EntityFramework.DynamicFilters, которые позволяют создавать динамические фильтры или вы можете динамически создавать предложение where в linq. вот отличный учебник, как динамически создавать предложение where.

https://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq

создание Этот фильтр немного утомительно, но это будет служить вашей цели.

+0

Для одного использования (и предопределенных условий для каждого отфильтрованного столбца) этот код слишком сложный ... ** и вам все равно нужно подтвердить, что он будет работать с вашим провайдером и выполнять фильтрацию на сервере **. – Phil1970

+0

, но это решение можно использовать во всех фильтрах, даже во второй части показан более общий подход к созданию этого фильтра. Проверьте, что у него есть 7 элементов для фильтрации его критериев, это составит около 7! = 5040, и я не думаю, что он собирается сделать это много запросов к фильтрации элементов. – Rajput

+0

Если вы посмотрите на комментарии, один из них: ** Код выражения не выполняется на сервере sql **, поэтому это ** красный флаг **. В любом случае у вас нет 5040 комбинаций, так как каждый фильтр может быть активирован независимо, поэтому у вас будет только 7 условий ... См. Также мой ответ. – Phil1970

0

Предполагая, что вы не хотите, чтобы обобщить, что для многих таблиц, я хотел бы сделать что-то вроде:

var query = 
    from m in db.table 
    select m; 

if (plan.HasValue) 
{ 
    query = query.Where(x => x.plan == plan.Value); 
} 

... other filters .... 

// Then use data (for ex. make a list). 
var list = query.ToList(); 

В зависимости от поставщика, вы могли бы также написать условие непосредственно в LINQ с чем-то вроде:

from m id db.table 
where plan == null || m.plan == plan 
where... 
select m; 

или с использованием !plan.HasValue || m.plan == plan.

Однако, это более хрупко, поскольку не все поставщики обрабатывают эти случаи одинаково или поддерживают их. Нужно быть особенно осторожным, если соответствующий столбец разрешает null.

0

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

var q = from mt in myTable 
     where (mt.FIrstname == FirstNameparam || FirstNameparam == null) 
     && (mt.lastname == lastnameParam || lastnameParam == null) 
     && (mt.DateField == DateParam || DateParam == null) 
     select new 
     { 
      mt.FIrstname, 
      mt.lastname, 
      mt.DateField 
     }; 
Смежные вопросы