2016-07-23 3 views
0

J'essaie d'implémenter l'arborescence d'expression avec linq.J'obtiens un état d'erreur car je ne peux pas convertir l'expression lambda en expression. S'il vous plaît aider j'ai vérifié autre solution, mais ne pouvait pas aider autant! Ci-dessous est mon codeImpossible de convertir 'System.Linq.Expressions.LambdaExpression' en 'System.Linq.Expressions.Expression

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(); 
+0

Quelle est la propriété que vous voulez trier? – user3185569

+0

que voulez-vous implémenter en utilisant cette arborescence d'expression? –

+1

Le titre du message est trompeur, car la dernière partie de l'erreur n'est pas simplement 'Expression', mais' Expression > ', ce qui est différent. Comment savez-vous que le type 'sortByProp' ** est ** int? –

Répondre

5

Il semble que vous essayez d'implémenter OrderBy dynamiquement en utilisant des arbres d'expression. Vous devriez essayer ce qui suit:

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); 
} 

et vous pouvez l'appeler comme:

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

Merci cela a fonctionné pour moi! – Akhilesh

+0

Génial. C'est bon que ça a marché. –

+0

Il semble que vous essayez d'implémenter OrderBy dynamiquement en utilisant des arborescences d'expression. Aimeriez-vous de l'aide? - Clippy – svick