7

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)

ありがとう

4

3 に答える 3

6

このようなもの?

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

Whereおそらく、述語を受け取り、それをこのような式に変換してから、Linqが提供するWhereメソッドを呼び出すICollectionViewの拡張メソッドを作成できます。

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を要求できるためです。これにより、デリゲートを元に戻すために必要な情報が得られます。

ただし、これは、LINQtoSQLとEntityFrameworkのどちらもこれを行わないためです。そうすることは、複雑で、壊れやすく、パフォーマンスを重視します。

つまり、簡単に言うと、それを式に変換することはできません。

于 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 に答える