Преобразовать предикат <T>в выражение> - PullRequest
7 голосов
/ 21 марта 2012

Можно ли каким-то образом преобразовать 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 ]

5 голосов
/ 21 марта 2012

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

Однако по той причине, что ни LINQ to SQL, ни Entity Framework не делают этого. Это сложно, хрупко и требует высокой производительности.

Итак, краткий ответ: вы не можете преобразовать его в выражение.

5 голосов
/ 21 марта 2012

Как то так?

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));
}
1 голос
/ 11 июля 2014
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 });
        }
    }
}
...