7

Predicate<T> to Expression<Func<T, bool>>可以以某种方式转换 a吗?

我想使用我的 ICollectionView 的过滤器来使用下一个 IQueryable 函数:

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

谢谢

4

3 回答 3

6

像这样的东西?

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

您可能可以Where为您的 ICollectionView 创建一个扩展方法,该方法接受一个谓词,将其转换为这样的表达式,然后调用 Linq 提供的 Where 方法。

public static IQueryable<T> Where(this IQueryable<T> source, Predicate<T> predicate)
{
    return source.Where(x => predicate(x));
}
于 2012-03-21T10:09:00.677 回答
5

理论上,可以将委托“返回”转换为表达式,因为您可以请求发出的委托 IL,这为您提供了将其转换回所需的信息。

但是,LINQ to SQL 和实体框架都没有这样做是有原因的。这样做是复杂、脆弱和性能密集型的。

所以简短的回答是,您不能将其转换为表达式。

于 2012-03-21T10:29:29.247 回答
1
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 });
        }
    }
}
于 2014-07-11T16:55:28.687 回答