Ну, пару лет спустя, но если кому-то это все еще нужно, вот оно:
public static IQueryable<T> Has<T>(this IQueryable<T> source, string propertyName, string keyword)
{
if (source == null || propertyName.IsNull() || keyword.IsNull())
{
return source;
}
keyword = keyword.ToLower();
var parameter = Expression.Parameter(source.ElementType, String.Empty);
var property = Expression.Property(parameter, propertyName);
var CONTAINS_METHOD = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var TO_LOWER_METHOD = typeof(string).GetMethod("ToLower", new Type[] { });
var toLowerExpression = Expression.Call(property, TO_LOWER_METHOD);
var termConstant = Expression.Constant(keyword, typeof(string));
var containsExpression = Expression.Call(toLowerExpression, CONTAINS_METHOD, termConstant);
var predicate = Expression.Lambda<Func<T, bool>>(containsExpression, parameter);
var methodCallExpression = Expression.Call(typeof(Queryable), "Where",
new Type[] { source.ElementType },
source.Expression, Expression.Quote(predicate));
return source.Provider.CreateQuery<T>(methodCallExpression);
}
Я назвал свой метод «Имею», просто чтобы он был коротким, пример использования:
filtered = filtered.AsQueryable().Has("City", strCity)
И вы можете объединить, чтобы сделать его еще более выразительным:
filtered = filtered.AsQueryable().Has("Name", strName).Has("City", strCity).Has("State", strState);
Кстати, "IsNull ()", прикрепленный к строкам, это просто еще один простой метод расширения:
public static Boolean IsNull(this string str)
{
return string.IsNullOrEmpty(str);
}