Я просто читал недавний вопрос на использовании условных выражений в 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;
}
Между прочим, вышеупомянутый код упрощен, в фактическом коде существует приблизительно дюжина пунктов, которые уточняют запрос на основе пользовательского поиска и фильтруют настройки.
Если количество условий неизвестно, то проще использовать синтаксис лямбды вместо понимания запроса, т.е.:
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, что, вероятно, проще.