Ich bekomme diese Ausnahme, wenn ich diesen Code ausführen.Dynamischer Lambda Ausdruck Anruf
Parameterexpression des Typs
System.Int64
kann nicht für die Delegierten Parameter vonSystem.Object
Typ verwendet werden
Ich weiß, es ist etwas, mit dem Expression.Lambda<func<object,bool>>
Teil des Codes zu tun. Insgesamt möchte ich jede Art von ParameterExpression
in diese Methode übergeben und es wird den Ausdruck aufrufen.
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: ich diese Antwort auf eine ähnliche Frage sah
Expression of type 'System.Int32' cannot be used for return type 'System.Object' Ich weiß nicht, wie es aber
EDIT 2 zu meinen Code anwenden: Die Hauptproblem ist, dass diese Expression.Lambda<Func<object, bool>>(conversion, new ParameterExpression[] { paramExpression }));
Zeile gibt mir eine Ausnahme. paramExpression enthält ein Int64, aber es erwartet ein Objekt. Ich weiß nicht, wie ich den Func dynamisch von den Informationen, die ich bereits habe, erzählen kann oder ob das möglich ist.
ZIEL: ich so etwas wie diese data.OrderBy(x=>x.DynamicProperty);
Sie verwenden T
Können Sie ein Beispiel schreiben, wie Sie diese verwenden, wie es richtig steht jetzt? Ohne das ist es schwierig zu beurteilen, wie es zu beheben ist. –
Ich postete die Methode die anderen beiden Methoden aufrufen. Es gibt nichts Höheres als jetzt, nur weil es noch nicht funktioniert. "IQueryable Daten" wäre so etwas wie "Liste Daten" @EBrown –
imGreg