加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在Linq中以编程方式使用条件

发布时间:2020-12-15 04:31:39 所属栏目:百科 来源:网络整理
导读:我刚刚在 using conditionals in Linq上阅读了一个最近的问题,它让我想起了一个我无法解决的问题.在以编程方式构建Linq to SQL查询时,如果在运行时之前不知道条件数,那么如何才能完成此操作? 例如,在下面的代码中,第一个子句创建一个IQueryable,如果执行它,
我刚刚在 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,这可能更容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读