我有一个gridview,每个标题中都有下拉框用于过滤.加载时,每个过滤器都会加载其列中的不同值.在运行时,我添加"ALL"以允许用户从该字段中选择所有内容.我正在尝试动态构建linq语句,如果下拉框设置为"ALL",则忽略该字段.这可能吗?我想看看我是否可以在一个声明中做到这一点.下面的示例仅显示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);
Run Code Online (Sandbox Code Playgroud)
    就个人而言,我发现这个问题更容易解决:
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
Run Code Online (Sandbox Code Playgroud)
这真的不再存在,而且更容易理解.
如果您真的希望能够将其写为"单行",则可以使用扩展方法来构建查询.例如,如果使用实体框架:
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;
}
Run Code Online (Sandbox Code Playgroud)
这样就可以把它写成:
var filteredList = allQuotes
                     .AddCondition(() => drpOwners.SelectedValue != ALL, x => x.SalesRepFullName == drpOwners.SelectedValue)
                     .AddCondition(() => drpCompanyName.SelectedValue != ALL, x.CompanyName == drpCompanyName.SelectedValue);
Run Code Online (Sandbox Code Playgroud)
当然,你可以更进一步,并制作一个硬连接谓词的版本来检查组合框中的"ALL",使谓词更短(只是组合框).
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           6592 次  |  
        
|   最近记录:  |