Это должно сработать:
Func<int, bool> predicate = expression.Compile();
IEnumerable<Wrapper> evenWrappedNumbers = wrappers.Where(w => predicate(w.Number));
Или, если вы действительно хотите IEnumerable<int>
Func<int, bool> predicate = expression.Compile();
IEnumerable<int> evenWrappedNumbers = wrappers.Where(w => predicate(w.Number)).Select(w => w.Number);
Редактировать: с тех пор, как вы узнали, что NHibernate используется, вот еще один возможныйрешение.Пожалуйста, имейте в виду, я не использую NHibernate и имею ограниченный опыт работы с деревьями выражений.Но, тем не менее, это, мы надеемся, позволит NHibernate разобрать дерево выражений в SQL.
Сначала определите метод расширения в статическом классе следующим образом:
public static IQueryable<T> Where<T, TProperty>(this IQueryable<T> source,
Expression<Func<T, TProperty>> propertySelector,
Expression<Func<TProperty, bool>> predicate)
{
MemberExpression member = propertySelector.Body as MemberExpression;
if (member == null)
throw new ArgumentException("Must be a property selector", "propertySelector");
string propertyName = member.Member.Name;
// The input type
ParameterExpression propertyParameter = Expression.Parameter(typeof(T));
// The property on that type
MemberExpression itemProperty = Expression.Property(propertyParameter, propertyName);
// Invoke the specified predicate with the property from the input type
InvocationExpression invokeExpression = Expression.Invoke(predicate, itemProperty);
// The lambda expression for use with Linq
Expression<Func<T, bool>> finalExpression = Expression.Lambda<Func<T, bool>>(invokeExpression, propertyParameter);
return source.Where(finalExpression);
}
Затем этот метод расширения можетиспользовать так:
IEnumerable<Wrapper> evenWrappedNumbers = wrappers.Where(w => w.Number, expression);
Как я уже сказал, у меня нет опыта работы с NHibernate, но, надеюсь, он сможет проанализировать это дерево выражений и преобразовать его в SQL.