2017-01-14 4 views
0

Je veux être en mesure d'ajouter la commande à mes requêtes dynamiquement:Enchaînement arbres d'expression IQueryable

Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order1 = e => e.OrderBy(x => x.Weight); 
Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order2 = e => e.OrderByDescending(x => x.Weight).ThenBy(x => x.Price); 
Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order3 = e => e.OrderBy(x => x.Category).ThenBy(x => x.Price); 

IQueryable<MyEntity> query = any EF query; 

var transformedQuery = query.Transform(order1/order2/order3); 

Comment puis-je mettre Transform()?

public static IQueryable<T> Transform<T>(this IQueryable<T> query, Expression<Func<IQueryable<T>, IOrderedQueryable<T>>> orderExpr) 
{ 
    // ?????????????????? 
} 

Mon problème est que je ne veux pas avoir 2 surcharges pour l'ordre croissant/décroissant. Je dois appliquer n'importe quelle expression OrderBy()/OrderByDescending() ou leur combinaison est passée.

+0

Ne pouvez-vous pas ajouter la première commande dans AddOrder? –

+0

Malheureusement non, j'ai besoin d'une méthode générique qui va effectuer d'autres transformations après avoir ajouté une commande à une requête. – UserControl

+0

Quel est le problème avec le OrderBy/ThenBy original? Comme @hdv a dit que vous n'avez pas besoin d'autre chose (si je ne manque rien ...) –

Répondre

0

Ceci est un cas où vous n'avez pas besoin d'un arbre d'expression. Ou même une méthode d'aide.

Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>> order = e => e.OrderBy(x => x.Weight); 
IQueryable<MyEntity> query = any EF query; 

var transformedQuery = order(query); 

Cela fonctionne parce que quand order est passé dans une requête, il peut appeler lui-même la surcharge Queryable.OrderBy appropriée qui prend un arbre d'expression.

+0

Je ne suis pas sûr de comprendre. J'ai besoin d'un param de commande en tant qu'expression car la requête transformée sera transmise au fournisseur EF. – UserControl

+0

@UserControl 'order' passera dans' x => x.Weight' comme arbre d'expression. C'est suffisant pour permettre à EF de le traduire en SQL. Lorsque vous écrivez 'context.MyEntities.OrderBy (e => e.MyProperty)' directement, ceci est un appel direct à 'Queryable.OrderBy' de la même manière. – hvd