转换谓词<;T>;到表达式<;Func<;T、 bool>>;
本文关键字:lt gt bool Func 表达式 谓词 转换 | 更新日期: 2023-09-27 18:28:42
是否可以通过某种方式转换Predicate<T> to Expression<Func<T, bool>>
?
我想使用我的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)
感谢
类似的东西?
Predicate<string> predicate = input => input.Length > 0;
Expression<Func<string, bool>> expression = (input) => predicate(input);
您可能可以为ICollectionView创建一个扩展Where
方法,该方法接受一个谓词,将其转换为类似这样的表达式,然后调用Linq提供的Where方法。
public static IQueryable<T> Where(this IQueryable<T> source, Predicate<T> predicate)
{
return source.Where(x => predicate(x));
}
理论上,可以将委托"转换回"表达式,因为您可以请求委托的已发出IL,这将为您提供将其转换回所需的信息。
然而,LINQ到SQL和实体框架都不这么做是有原因的。这样做是复杂、脆弱和性能密集的
所以简单的答案是,你不能把它转化为一个表达式。
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 });
}
}
}