3 votes

Essayer de passer la clause order by comme paramètre

J'essayais de passer orderby en tant que paramètre :

public IList<SomeType> GetData(Expression<Func<Customer, object>> order)
{
        if (order==null)
        {
            order =   x => x.PrintOrder ;
        }

        var list = (from c in this.dbContext.Customer
                    where c.Type==1
                    orderby order
                    select new {c.Name }).ToList();

        return list;
}

Mais il y a une erreur :

System.InvalidOperationException : n'a pas pu être traduit.
Soit vous réécrivez la requête sous une forme qui peut être traduite, soit vous passez explicitement à l'évaluation par le client en insérant un appel à 'AsEnumerable', 'AsAsyncEnumerable' et 'ToList'.

4voto

jialuo zeng Points 56
public IList<Customer> GetData(Expression<Func<Customer, object>> order = null)
    {

    order ??= x => x.PrintOrder;

    //var list = (from c in this.dbContext.Customer
    //             where c.Type==1
    //          orderby order
    //          select c).ToList();

    //may works
    return  this.dbContext.Customer.Where(c => c.Type == 1)
                                   .OrderBy(order)
                                   .ToList();
    }

-1voto

PawZaw Points 55

Mise à jour : Comme suggéré dans les commentaires, cette méthode ne convient que pour les situations LINQ-to-object, si vous vous connectez à la DB, utilisez plutôt les réponses acceptées.

Réponse originale :

Ça marche :

Func<Customer, object> order = (c) => c.PrintOrder;
var list = (from c in this.dbContext.Customer
        orderby order(c)
        select c).ToList();

La différence réside dans l'appel de la fonction order(c), au lieu de la passer simplement à la fonction

Vous pouvez également utiliser cette syntaxe :

Func<Customer, object> order = (c) => c.PrintOrder;
var list = this.dbContext.Customer.OrderBy(order).ToList();

Jetez un coup d'œil à ce post : Comment puis-je faire un OrderBy avec un paramètre de chaîne dynamique ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X