我刚刚在
using conditionals in Linq上阅读了一个最近的问题,它让我想起了一个我无法解决的问题.在以编程方式构建Linq to SQL查询时,如果在运行时之前不知道条件数,那么如何才能完成此操作?
例如,在下面的代码中,第一个子句创建一个IQueryable,如果执行它,将选择数据库中的所有任务(称为问题),第二个子句将把它改进为仅分配给一个部门的问题(如果在一个部门中选择了一个) comboBox(将其选中的项目绑定到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;
- }
解决方法
如果条件的数量未知,则使用lambda语法而不是查询理解更容易,即:
- 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,这可能更容易.