No se puede convertir de 'System.Linq.Expressions.LambdaExpression' a 'System.Linq.Expressions.Expression

c# expression-trees linq

Pregunta

Estoy intentando implementar el árbol de expresiones con linq. Recibo un estado de error porque no puedo convertir lambdaexpression en expresiones. ¡Por favor, ayúdeme a comprobar otra solución pero no pude ayudar tanto! Abajo esta mi codigo

ParameterExpression pe = Expression.Parameter(typeof(Person), "p");
var expr = Expression.Lambda(Expression.Property(pe, sortByProp), pe);        
          var d=  expr.Compile();
            IQueryable<Person> query = persons.AsQueryable();
            List<Person> sortedList = query.OrderBy<Person, int>(expr).ToList();

Respuesta aceptada

Parece que estás intentando implementar OrderBy dinámicamente usando árboles de expresiones. Debes probar lo siguiente:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string sortProperty, ListSortDirection sortOrder)
{
    var type = typeof(T);
    var property = type.GetProperty(sortProperty);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    var typeArguments = new Type[] { type, property.PropertyType };
    var methodName = sortOrder == ListSortDirection.Ascending ? "OrderBy" : "OrderByDescending";
    var resultExp = Expression.Call(typeof(Queryable), methodName, typeArguments, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}

y luego puedes llamarlo como:

collection.OrderBy("Property on which you want to sort", ListSortDirection.Ascending);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow