Expression.Call方法中的参数数量不正确

时间:2014-06-11 08:30:07

标签: c# .net linq nhibernate lambda

我有一个ToFutureValue方法,可以将IQueryable转换为FutureValue以便将来执行。在这里,我们最终使用NHibernate转换Linq to Sql

public static IFutureValue<TResult> ToFutureValue<TSource, TResult>(
        this IQueryable<TSource> query,
        Expression<Func<IQueryable<TSource>, TResult>> selector, params object[] arguments)
    {
        if (query is IFutureQuery<TSource>)
        {
            var futureQuery = query as IFutureQuery<TSource>;
            var method = ((MethodCallExpression)selector.Body).Method;

            // here we call method which has Expression.call statement
            var retval = futureQuery.ExecuteFutureValue<TResult>(method, arguments);

            return retval;
        }
        throw new FutureException(FutureException.WrongQueryType);
    }

以下是具有Expression.Call()

的方法
    public IFutureValue<TResult> ExecuteFutureValue<TResult>(MethodInfo method, params object[] arguments)
    {
        var expression = Expression.Call(null,
            method,
            arguments.Select(x =>
            {
                if (x is Expression)
                    return x as Expression;
                else if (x is string)
                {
                    // Problem is here......

                    Expression<Func<string>> arg = () => x.As<string>();
                    return arg;

                    // ................
                }
                else
                    return Expression.Constant(x);
            }).ToArray()
            );

        var provider = (FutureQueryProvider)Provider;

        var future = (Nh.IFutureValue<TResult>)provider.ExecuteFuture(expression);

        return new FutureValue<TResult>(future.Value);
    }

我试图调用的表达方法如下,并且已经过测试并且工作正常。现在,Expression.Call必须调用此方法并替换正确的参数。在这里,它必须采用表达式并替换该表达式中的字符串。这就是我在上述方法中试图实现的目标。

IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)

但是,我收到以下错误,

Incorrect number of arguments supplied for call to method 'System.Linq.IOrderedQueryable`1[Measurement.Model.Test.TestPieceDto] OrderByDescending[TestPieceDto](System.Linq.IQueryable`1[Measurement.Model.Test.TestPieceDto], System.String)'

我认为这是因为Expression.Call没有正确地替换参数。关于如何替换字符串参数的任何想法。另请注意,我们在Expression.Call中使用了一个对象数组,以防万一有多个参数。但是,我试图调用的方法只有一个参数(这可能是一个问题,我不确定)。

0 个答案:

没有答案