Синтаксис метода LINQ - как выполнять динамические операторы Linq - PullRequest
2 голосов
/ 02 мая 2011

Я использую Linq to Entities для извлечения моих записей из БД. Функция ниже в методе. Метод имеет несколько параметров (аргументов), таких как группа, дата от, дата до, место, состояние, текст поиска и т. Д. И т. Д.

вся идея в том, что если эти параметры не пусты или не равны нулю, тогда выполняются инструкции LINQ. Я проверяю, есть ли значение или нет. если оно имеет значение, то я передаю, например, a.no_group = group, если она не имеет значения, тогда я передаю оператор типа a.id! = - 1, который всегда верен.

Проблема: Я имею в виду, что я не доволен передачей каждого утверждения типа " a.id! = -1 ", что всегда верно. Я использую это, потому что я должен поставить ценность там. Но я не доволен этим способом ... (это работает!)

Вопрос: Вопрос в том, как правильно поступить? 1- Могу ли я заменить a.id! = -1 чем-то другим?

2 - Если вы видите, что весь оператор linq дублируется из-за проверки языка. Как вы видите последний Оператор linq проверяет язык 'голландский' или 'французский' ... Как избежать дублирования?

3- Я проверяю, находится ли текущая дата (datetime.now) между date_begin и date_end. Это правильный путь ...

Весь код работает нормально, но я думаю, что усложняю код, который может быть намного проще ...

а как?

if (Language == ConfBouwHelper.LanguageEnum.French)
{
//FRENCH RECORDS
 listAgendaItems = dc.agenda.Where(a =>
   ((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group))
&& ((activityType.Equals("ALL")) ? (a.id != -1) : (a.type_manifestation == activityType))
&& ((String.IsNullOrEmpty(dateFrom)) ? (a.id != -1) : (a.date_debut.Value >= dateFrom))
&& ((String.IsNullOrEmpty(dateTo)) ? (a.id != -1) : (a.date_debut.Value <= dateTo))
&& ((String.IsNullOrEmpty(place)) ? (a.id != -1) : (a.emplacement.Contains(place)))
&& ((String.IsNullOrEmpty(state)) ? (a.id != -1) : (a.cd_prov == state))
&& ((String.IsNullOrEmpty(searchText)) ? (a.id != -1) : (a.libelle_activite.Contains(searchText)))
&& ((a.date_begin_display.HasValue ? DateTime.Now >= a.date_begin_display.Value : a.id != -1) &&
   (a.date_end_display.HasValue ? DateTime.Now <= a.date_end_display.Value : a.id != -1))
&& (a.langue == "FRENCH" || a.langue == "B")).ToList<agenda>(); //GET FRENCH
}
else
//DUTCH RECORDS
{
 listAgendaItems = dc.agenda.Where(a =>
   ((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group))
&& ((activityType.Equals("ALL")) ? (a.id != -1) : (a.type_manifestation == activityType))
&& ((String.IsNullOrEmpty(dateFrom)) ? (a.id != -1) : (a.date_debut.Value >= dateFrom))
&& ((String.IsNullOrEmpty(dateTo)) ? (a.id != -1) : (a.date_debut.Value <= dateTo))
&& ((String.IsNullOrEmpty(place)) ? (a.id != -1) : (a.emplacement.Contains(place)))
&& ((String.IsNullOrEmpty(state)) ? (a.id != -1) : (a.cd_prov == state))
&& ((String.IsNullOrEmpty(searchText)) ? (a.id != -1) : (a.libelle_activite.Contains(searchText)))
&& ((a.date_begin_display.HasValue ? DateTime.Now >= a.date_begin_display.Value : a.id != -1) &&
   (a.date_end_display.HasValue ? DateTime.Now <= a.date_end_display.Value : a.id != -1))

&& (a.langue == "DUTCH" || a.langue == "B")).ToList<agenda>(); //GET DUTCH
}

1 Ответ

2 голосов
/ 02 мая 2011

Вы можете добавить несколько предложений where:

var query = dc.agenda;
if(!String.IsNullOrEmpty(group))
    query = query.Where(a => a.no_group == group)
if(!activityType.Equals("ALL"))
    query = query.Where(a => a.type_manifestation == activityType)
// and so on for all your conditions...

if (Language == ConfBouwHelper.LanguageEnum.French)
    query = query.Where(a => (a.langue == "FRENCH" || a.langue == "B"));
else
    query = query.Where(a => (a.langue == "DUTCH" || a.langue == "B"));

listAgendaItems = query.ToList<agenda>();

Это намного чище и удобочитаемее, а также решает проблему с дублированием из-за языков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...