LINQ的动态添加where条件 [英] Linq dynamically adding where conditions

查看:209
本文介绍了LINQ的动态添加where条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有在每个标题过滤下拉框一个gridview。装载时每个滤波器装有从其列不同的值。在运行时,我加上ALL,以允许用户从该字段中选择所有。我试图动态生成的LINQ语句,如果下拉框设置为ALL忽略场。这可能吗?我想看看我是否可以在一个单独的语句做到这一点。下面仅示例显示2下拉框,但我的实际情况下,拥有高达5。



如果我选择使用,如果再声明,我结束了意大利面条的代码

  DropDownList的drpOwners = this.grdOtherQuotes.HeaderRow.FindControl(drpOwners)作为DropDownList的; 
DropDownList的drpCompanyName = this.grdOtherQuotes.HeaderRow.FindControl(drpCompanyName)作为DropDownList的;

VAR filteredList =(从allQuotes
x,其中(drpOwners.SelectedValue = ALL)x.SalesRepFullName == drpOwners.SelectedValue:真正的
和;&安培; drpCompanyName!?。的SelectedValue = ALL x.CompanyName == drpCompanyName.SelectedValue!?真
选择x);


解决方案

个人而言,我觉得有这个挖开更简单:

 的IEnumerable<&报价GT; filteredList = allQuotes; 
//如果使用EF或LINQ to SQL中,使用:IQueryable的<&报价GT; filteredList = allQuotes;
如果(drpOwners.SelectedValue = ALL!)
filteredList = filteredList.Where(X => x.SalesRepFullName == drpOwners.SelectedValue);
如果(drpCompanyName.SelectedValue = ALL!)
filteredList = filteredList.Where(X => x.CompanyName == drpCompanyName.SelectedValue);
//更多条件需要

这真的是没有任何更长的时间,这是远简单的跟进。






如果你真的希望能够写这为单行,你可以做一个扩展方法来构建查询。例如,如果使用实体框架:

 静态的IQueryable< T> AddCondition(这IQueryable的< T>可查询,Func键<布尔>谓语,表达< Func键< T,BOOL>>过滤器)
{
如果(谓词())
返回queryable.Where (过滤);
,否则
回报率可查询;
}

这会然后让你写为:

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

您可以,当然,即使进一步借此,使一个版本硬导线谓词要检查ALL组合框,使得谓语较短(只是组合框)。


I have a gridview which has drop down boxes in each header for filtering. Each filter is loaded with the distinct values from its column when loaded. At run time, I add "ALL" to allow the user to select all from that field. I am trying to build the linq statement dynamically to ignore the field if the drop down box is set to "ALL". Is this possible? I want to see if I can do this in one single statement. The example below only shows 2 dropdown boxes, but my actually case has up to 5.

If I choose to use if then statements, I end up with spaghetti code.

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);

解决方案

Personally, I'd find having this broken up to be simpler:

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

This really isn't any longer, and it's far simpler to follow.


If you really wanted to be able to write this as a "one-liner", you could make an extension method to build the query. For example, if using 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;
}

This would then let you write this as:

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

You could, of course, take this even further, and make a version that hard-wires the predicate to check a combo box against "ALL", making the predicate shorter (just the combo box).

这篇关于LINQ的动态添加where条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆