3

我有一个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);
4

3 回答 3

10

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

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

这真的不再是了,而且要简单得多。


如果您真的希望能够将其编写为“单线”,您可以创建一个扩展方法来构建查询。例如,如果使用实体框架:

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”相对,使谓词更短(只是组合框)。

于 2012-10-16T16:45:12.120 回答
1

您可以创建一个处理 All 逻辑的辅助方法。就像是:

private bool CompareSelectedValue(string value, string dropDownValue)
{
  if(dropDownValue == "ALL")
    return true;
  else
    return value == dropDownValue;
}

那么您的查询可能是:

var filteredList = (from x in allQuotes
                          where (CompareSelectedValue(x.SalesRepFullName, drpOwners.SelectedValue)                                    
                                && CompareSelectedValue(x.CompanyName, drpCompanyName.SelectedValue)
                          select x);
于 2012-10-16T16:50:26.340 回答
0

创建封装 where 逻辑的扩展方法,使其看起来更清晰:

var filteredList = allQuotes.WhereDropOwnersAreContained()
                            .WhereCompanyIsContained()
                            ...
                            ;
于 2012-10-16T16:59:33.427 回答