Я нахожусь в процессе выполнения именно этого ... Я использую выражения, потому что Func - это скомпилированный код, где Expression<Func<YourObect, boo>>
может быть преобразован в C # или TSql или что-то еще ... Я только что видел, как несколько человек рекомендуют использовать выражение вместо просто func.
На странице поиска вы реализуете код, подобный следующему:
SearchCritera<Customer> crit = new SearchCriteria<Customer>();
if (txtName.Text.Length > 0) {
//add it to the function
crit.Add(a.Name.StartsWith(txtName.Text));
}
if (txtType.Text.Length > 0) {
//add it to the function
crit.Add(a.Type == txtType.Text));
}
Объект SearchCriteria выглядит примерно так ...
public class SearchCritera<TEntity>
{
private List<Expression<Func<TEntity, bool>>> _Criteria = new List<Expression<Func<TEntity, bool>>>();
public void Add(Expression<Func<TEntity, bool>> predicate)
{
_Criteria.Add(predicate);
}
// This is where your list of Expression get built into a single Expression
// to use in your Where clause
public Expression<Func<TEntity, bool>> BuildWhereExpression()
{
Expression<Func<TEntity, bool>> result = default(Expression<Func<TEntity, bool>>);
ParameterExpression parameter = Expression.Parameter(typeof(TEntity), "entity");
Expression previous = _Criteria[0];
for (int i = 1; i < _Criteria.Count; i++)
{
previous = Expression.And(previous, _Criteria[i]);
}
result = Expression.Lambda<Func<TEntity, bool>>(previous, parameter);
return result;
}
}
Тогда из пункта «Где» вы можете сделать это ...
public List<Customer> FindAllCustomers(SearchCriteria criteria)
{
return LinqToSqlDataContext.Customers.Where(SearchCriteria.BuildWhereExpression()).ToList();
}
Это первый раз, когда я закодировал это, и вам, возможно, понадобится внести некоторые изменения для ваших целей, я знаю, что это компилируется, но когда я иду к этому, я проведу модульное тестирование, но у меня есть идея ворочался в моей голове ...