Преобразовать предикат в выражение>


Можно ли каким-то образом преобразовать Predicate<T> to Expression<Func<T, bool>>?

Я хотел бы использовать следующую IQueryable функцию, используя фильтры my ICollectionView:

public static System.Linq.IQueryable<TSource> Where<TSource>(this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<System.Func<TSource, bool>> predicate)

Спасибо

3 6

3 ответа:

Теоретически можно преобразовать делегат "назад" в выражение, потому что вы можете запросить испущенный IL делегата, который дает вам информацию, необходимую для преобразования его обратно.

Тем не менее, именно по этой причине ни LINQ to SQL, ни Entity Framework не делают этого. Это сложный, хрупкий и трудоемкий процесс.

Короче говоря, вы не можете преобразовать его в выражение.

Что-то вроде этого?

Predicate<string> predicate = input => input.Length > 0;
Expression<Func<string, bool>> expression = (input) => predicate(input);

Вероятно, вы можете создать метод расширения Where для вашего ICollectionView, который принимает предикат, преобразует его в выражение, подобное этому, а затем вызывает метод Where, предоставляемый Linq.

public static IQueryable<T> Where(this IQueryable<T> source, Predicate<T> predicate)
{
    return source.Where(x => predicate(x));
}
namespace ConsoleApplication1
{
    static class Extensions
    {
        public static Expression<Func<T, bool>> ToExpression<T>(this Predicate<T> p)
        {
            ParameterExpression p0 = Expression.Parameter(typeof(T));
            return Expression.Lambda<Func<T, bool>>(Expression.Call(p.Method, p0), 
                  new ParameterExpression[] { p0 });
        }
    }
}