下面是场景: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