gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:22:31 29 4
gpt4 key购买 nike

我刚刚阅读了最近关于 using conditionals in Linq 的问题这让我想起了一个我一直无法解决的问题。当以编程方式构建 Linq to SQL 查询时,如果直到运行时才知道条件的数量,如何做到这一点?

例如,在下面的代码中,第一个子句创建了一个 IQueryable,如果执行,它将选择数据库中的所有任务(称为问题),第二个子句将细化为仅分配给一个部门的问题,如果一个已经被在组合框中选择(它的选定项目绑定(bind)到 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这可能更容易。

关于c# - 以编程方式在 Linq 中使用条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2439221/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com