gpt4 book ai didi

c# - Linq动态添加where条件

转载 作者:行者123 更新时间:2023-11-30 13:39:13 26 4
gpt4 key购买 nike

我有一个 gridview,它在每个标题中都有用于过滤的下拉框。每个过滤器在加载时都加载了来自其列的不同值。在运行时,我添加“ALL”以允许用户从该字段中选择所有内容。如果下拉框设置为“ALL”,我正在尝试动态构建 linq 语句以忽略该字段。这可能吗?我想看看我是否可以在一条语句中做到这一点。下面的示例只显示了 2 个下拉框,但我的实际案例最多有 5 个。

如果我选择使用 if then 语句,我将得到意大利面条代码。

DropDownList drpOwners = this.grdOtherQuotes.HeaderRow.FindControl("drpOwners") as DropDownList;                     
DropDownList drpCompanyName = this.grdOtherQuotes.HeaderRow.FindControl("drpCompanyName") as DropDownList;

var filteredList = (from x in allQuotes
where (drpOwners.SelectedValue != ALL) ? x.SalesRepFullName == drpOwners.SelectedValue:true
&& drpCompanyName.SelectedValue != ALL ? x.CompanyName == drpCompanyName.SelectedValue: true
select x);

最佳答案

就我个人而言,我发现将其分解会更简单:

IEnumerable<Quote> filteredList = allQuotes;
// If using EF or LINQ to SQL, use: IQueryable<Quote> filteredList = allQuotes;
if (drpOwners.SelectedValue != ALL)
filteredList = filteredList.Where(x => x.SalesRepFullName == drpOwners.SelectedValue);
if (drpCompanyName.SelectedValue != ALL)
filteredList = filteredList.Where(x => x.CompanyName == drpCompanyName.SelectedValue);
// More conditions as needed

这确实不再存在,而且更容易遵循。


如果您真的希望能够将其写成“单行代码”,您可以创建一个扩展方法来构建查询。例如,如果使用 Entity Framework :

static IQueryable<T> AddCondition(this IQueryable<T> queryable, Func<bool> predicate, Expression<Func<T,bool>> filter)
{
if (predicate())
return queryable.Where(filter);
else
return queryable;
}

这会让你这样写:

var filteredList = allQuotes
.AddCondition(() => drpOwners.SelectedValue != ALL, x => x.SalesRepFullName == drpOwners.SelectedValue)
.AddCondition(() => drpCompanyName.SelectedValue != ALL, x.CompanyName == drpCompanyName.SelectedValue);

当然,您可以更进一步,制作一个硬连接谓词的版本,以根据“ALL”检查组合框,从而缩短谓词(仅组合框)。

关于c# - Linq动态添加where条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919504/

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