LINQ的动态添加where条件 [英] Linq dynamically adding where conditions
问题描述
我有在每个标题过滤下拉框一个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屋!