Используя условные выражения в Linq Программно

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

Например, в коде ниже первого пункта создает IQueryable, который, если выполняется, выбрал бы все задачи (названный проблемами) в базе данных, 2-й пункт совершенствует это только к проблемам, присвоенным одному отделу, если Вы были выбраны в поле комбинированного списка (Который имеет, это - выбранный пункт, связанный с departmentToShow свойством).

Как я мог сделать это использование selectedItems набора вместо этого?

IQueryable 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;
    }

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

7
задан Cœur 29 December 2018 в 02:23
поделиться

1 ответ

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

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, что, вероятно, проще.

7
ответ дан 7 December 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: