Я получаю это исключение, когда запускаю этот код.Динамический вызов выражения Lambda
ParameterExpression типа
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);
}
EDIT: я видел этот ответ на аналогичный вопрос
Expression of type 'System.Int32' cannot be used for return type 'System.Object' Я не знаю, как применить его к моему коду, хотя
EDIT 2: The Основная проблема заключается в том, что эта строка Expression.Lambda<Func<object, bool>>(conversion, new ParameterExpression[] { paramExpression }));
дает мне исключение. paramExpression содержит Int64, но его ожидает объект. Я не знаю, как динамически сообщать Func из информации, которую я уже имею, или если это возможно.
ЦЕЛЬ: Я пытаюсь сделать что-то вроде этого data.OrderBy(x=>x.DynamicProperty);
Вы используете T <объект, BOOL> и ваш параметр является структурой ... вы не можете бросить на объект-структуру –
Вы можете разместить пример того, как вы используете это, как она стоит Теперь? Без этого трудно оценить, как это исправить. –
Я отправил метод вызова двух других методов. Сейчас нет ничего выше, только потому, что он еще не работает. 'IQueryable data' будет что-то вроде этого' List data' @EBrown –
imGreg