【发布时间】:2010-09-20 21:23:22
【问题描述】:
这是场景:
Silverlight 4.0、DataGrid、PagedCollectionView itemssource。
目标是将过滤器应用于 PCV。过滤器必须是 Predicate<object>(Method) - 其中 Method 对对象实施一些逻辑并返回 true/false 以供包含。
我需要在过滤器逻辑中选择性地包含 3 个不同的标准,并且显式代码很快就会变得丑陋。我们不想这样,不是吗?
所以我看到有一种方法可以使用 PredicateBuilder 构建表达式树并将其传递到 Linq.Where,a la:
IQueryable<Product> SearchProducts (params string[] keywords)
{
var predicate = PredicateBuilder.False<Product>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or (p => p.Description.Contains (temp));
}
return dataContext.Products.Where (predicate);
}
[顺便说一句,这不是我想要做的]
有 3 个可选条件,我想写如下内容:
Ratings.Filter = BuildFilterPredicate(); // Ratings = the PagedCollectionView
private Predicate<object> BuildFilterPredicate()
{
bool FilterOnOrder = !String.IsNullOrEmpty(sOrderNumberFilter);
var predicate = PredicateBuilder.False<object>();
if (ViewMineOnly)
{
predicate = predicate.And(Rating r => sUserNameFilter == r.Assigned_To);
}
if (ViewStarOnly)
{
predicate = predicate.And(Rating r => r.Star.HasValue && r.Star.Value > 0);
}
if (FilterOnOrder)
{
predicate = predicate.And(Rating r => r.ShipmentInvoice.StartsWith(sOrderNumberFilter));
}
return predicate;
}
当然这不会编译,因为 PredicateBuilder 创建一个 Expression<Func<T, bool>> 而不是实际的谓词方法。但我看到有一些方法可以将表达式树转换为方法,所以在我看来,应该有一种方法可以完成我所追求的目标,而无需求助于一堆嵌套的 if/then/else 语句。
所以问题是 - 有没有办法动态构建谓词方法?
TIA
【问题讨论】:
标签: silverlight filter expression-trees predicatebuilder