2

最終的にクエリを実行しようとすると、次のエラーが発生します

タイプ 'IsFalse' の不明な LINQ 式

これがコードです

private static IQueryable<T> QueryMethod<T>(
    IQueryable<T> query,
    QueryableRequestMessage.WhereClause.Rule rule,
    Type type,
    string methodName,
    Expression property,
    Expression value,
    string op,
    ParameterExpression parameter
) where T : class
{
    var methodInfo = type.GetMethod(methodName, new[] { type });
    var call = Expression.Call(property, methodInfo, value);
    var expression = rule.Op.Equals(op)
                            ? Expression.Lambda<Func<T, bool>>(call, parameter)
                            : Expression.Lambda<Func<T, bool>>(Expression.IsFalse(call), parameter);
    query = query.Where(expression);
    return query;
}

重要な変数には次の値があります

query: an IQueryable that I am building up
type: String
methodName: "EndsWith"
rule.Op: "ne" //Not Ends With
op: "ew"
value: "somestring"

基本的に、op と rule.Op が等しい場合、methodName (EndsWith) を実行し、それに応じてフィルタリングします。しかし、もし違うなら結果を否定したい。

4

1 に答える 1

6

あなたは何も悪いことをしていないようです。LINQプロバイダーは、Expression.IsFalse返される式ツリーインスタンスを処理する方法を知らないため、文句を言います。

「isfalse」式ツリーを自分で手動で作成してみることができます。これは機能するはずです。

Expression.Lambda<Func<T, bool>>(
   Expression.Equal(call, Expression.Constant(false)),
   parameter)
于 2013-02-12T15:17:11.920 に答える