Вот сценарий:
Silverlight 4.0, DataGrid, PagedCollectionView itemssource.
Цель состоит в том, чтобы применить фильтр к PCV. Фильтр должен быть Predicate<object>(Method)
- где метод реализует некоторую логику для объекта и возвращает true / false для включения.
У меня есть необходимость дополнительно включить 3 различных критерия в логику фильтра, и явный код быстро становится безобразным. Мы этого не хотим?
Итак, я вижу, что есть способ построить дерево выражений с помощью PredicateBuilder и передать его в Linq. Где, а-ля:
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.
Итак, вопрос в том, есть ли способ динамически создать метод предиката?
ТИА