【发布时间】:2015-05-16 03:20:58
【问题描述】:
我在运行此代码时遇到此异常。
System.Int64类型的参数表达式不能用于System.Object类型的委托参数
我知道这与代码的Expression.Lambda<func<object,bool>> 部分有关。总的来说,我想将任何类型的ParameterExpression 传递给这个方法,它会调用表达式。
public static IQueryable<T> OrderData<T>(IQueryable<T> data)
{
try
{
Order order = Order.ASC;
var result = Enum.TryParse<Order>(_gridSettings.SortOrder, true, out order);
if (_gridSettings.IsSearch)
{
data = ExpressionSort(order, data, typeof(T).GetProperty(_gridSettings.SortColumn));
}
else
{
data = ExpressionSort(order, data, _defaultColumn);
}
}
catch (Exception ex)
{
log.WriteLog(MethodBase.GetCurrentMethod(), LogLevel.FATAL, ex);
}
return data;
}
private static IQueryable<T> ExpressionSort<T>(Order order, IQueryable<T> data, PropertyInfo property)
{
// Compose the expression tree that represents the parameter to the predicate.
ParameterExpression paramExpression = Expression.Parameter(property.PropertyType, property.Name);
IQueryable<T> queryableData = data.AsQueryable<T>();
switch (order)
{
case Order.ASC:
return ExecuteCall(paramExpression, paramExpression, queryableData, "OrderBy");
case Order.DESC:
return ExecuteCall(paramExpression, paramExpression, queryableData, "OrderByDescending");
}
return data;
}
private static IQueryable<T> ExecuteCall<T>(Expression expression, ParameterExpression paramExpression, IQueryable<T> queryableData, string linqMethod)
{
MethodCallExpression callExpression = Expression.Call(
typeof(Queryable),
linqMethod,
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<object, bool>>(expression, new ParameterExpression[] { paramExpression }));
// Create an executable query from the expression tree.
return queryableData.Provider.CreateQuery<T>(callExpression);
}
编辑: 我确实看到了类似问题的答案
Expression of type 'System.Int32' cannot be used for return type 'System.Object' 我不知道如何将它应用到我的代码中
编辑 2:
主要问题是 thisExpression.Lambda<Func<object, bool>>(conversion, new ParameterExpression[] { paramExpression })); 行给了我一个例外。 paramExpression 包含一个 Int64 但它期望一个对象。我不知道如何从我已经拥有的信息中动态地告诉 Func,或者是否有可能。
目标:
我正在尝试做这样的事情data.OrderBy(x=>x.DynamicProperty);
【问题讨论】:
-
您正在使用 T
-
你能发布一个你如何使用它的例子吗?没有它就很难评估如何解决它。
-
我贴出了调用其他两个方法的方法。现在没有比这更高的了,只是因为它还不起作用。
IQueryable<T> data会是这样的List<MyClass> data@EBrown -
MyClass会是什么样子?_gridSettings是什么?_defaultColumn是什么? -
为了保持示例简单,
MyClass将只包含prop1,即int。_gridSettings只是一个对象,它会告诉我按 asc 或 desc 排序哪一列。defaultColumn是列的PropertyInfo。
标签: c# linq generics expression