Использование условных выражений в Linq программно - PullRequest
7 голосов
/ 13 марта 2010

Я только что прочитал недавний вопрос о , используя условные выражения в Linq , и он напомнил мне о проблеме, которую мне не удалось решить. При программной сборке запросов Linq to SQL, как это можно сделать, если число условий не известно до времени выполнения?

Например, в приведенном ниже коде первое предложение создает IQueryable, который в случае выполнения выберет все задачи (называемые проблемами) в базе данных, а второе предложение уточнит это так, чтобы оно просто относилось к проблемам, назначенным одному отделу, если он выбранный в выпадающем списке (у которого выбранный элемент привязан к свойству DepartmentToShow).

Как я могу сделать это, используя вместо этого коллекцию selectedItems?

IQueryable<Issue> issuesQuery;

// Will select all tasks
issuesQuery = from i in db.Issues
              orderby i.IssDueDate, i.IssUrgency
              select i;

// Filters out all other Departments if one is selected
   if (departmentToShow != "All")
   {
        issuesQuery = from i in issuesQuery
                      where i.IssDepartment == departmentToShow
                      select i;
    }

Кстати, приведенный выше код упрощен, в реальном коде есть около десятка предложений, которые уточняют запрос на основе настроек поиска и фильтрации пользователей.

1 Ответ

7 голосов
/ 13 марта 2010

Если число условий неизвестно, тогда проще использовать лямбда-синтаксис вместо понимания запроса, т. Е .:

IQueryable<Issue> issues = db.Issues;
if (departmentToShow != "All")
{
    issues = issues.Where(i => i.IssDepartment == departmentToShow);
}
issues = issues.OrderBy(i => i.IssDueDate).ThenBy(i => i.IssUrgency);

(Предполагая, что вы хотите, чтобы упорядочение происходило после фильтрации, что должно иметь место - я не уверен, что Linq сгенерирует оптимизированный запрос, если вы попытаетесь упорядочить сначала).

Если у вас очень много необязательных условий, вы можете очистить их с помощью предикатов:

List<Predicate<Issue>> conditions = new List<Predicate<Issue>>();
if (departmentToShow != "All")
    conditions.Add(i => i.IssDepartment == departmentToShow);
if (someOtherThing)
    conditions.Add(anotherPredicate);
// etc. snip adding conditions

var issues = from i in issues
             where conditions.All(c => c(i))
             orderby i.IssDueDate, i.IssUrgency;

Или просто используйте PredicateBuilder , что, вероятно, проще.

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