我有一个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
中使用了一个对象数组,以防万一有多个参数。但是,我试图调用的方法只有一个参数(这可能是一个问题,我不确定)。