Comment gérer la pagination IQueryable avec Linq To Entities? (problème avec OrderBy)

entity-framework generics iqueryable

Question

Je suis en train de construire un site ASP.NET MVC simple en utilisant Linq to Entities. Ma première incursion dans ce monde a été le dîner nerd, où j'ai trouvé le code de liste paginé que je tente d'utiliser. Le code se présente comme suit:

public class PaginatedList<T> : List<T>
{

    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public int TotalCount { get; private set; }
    public int TotalPages { get; private set; }

    public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = source.Count();
        TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

        this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
    }

    public bool HasPreviousPage
    {
        get
        {
            return (PageIndex > 0);
        }
    }

    public bool HasNextPage
    {
        get
        {
            return (PageIndex + 1 < TotalPages);
        }
    }
}

Le problème est que j'utilise le framework d'entité, et le code ci-dessus renvoie l'erreur suivante:

La méthode 'Ignorer' n'est prise en charge que pour l'entrée triée dans LINQ to Entities. La méthode 'OrderBy' doit être appelée avant la méthode 'Skip'.

Ne connaissant pas les tenants et les aboutissants de Linq, je ne suis pas sûr de savoir comment ajouter une clause orderby lorsque je ne sais pas quels noms de colonne seront dans la méthode ci-dessus, ce qui est générique.

Merci!

Réponse acceptée

Je pense que votre meilleur pari sera de vous assurer que vos requêtes ont un ordre avant de les passer à la liste PaginatedList .


Réponse populaire

Premièrement, je suggérerais fortement d’utiliser le code gratuit PagedList plutôt que d’écrire le vôtre, car il prend en compte de nombreuses choses que vous auriez éventuellement à découvrir par vous-même et n’a pratiquement aucun inconvénient.

Pour répondre à votre question, vous devez trier votre liste avant de la transmettre à la fonction de pagination. Si vous devez le faire de manière dynamique, vous pouvez utiliser la bibliothèque Microsoft DynamicQuery . Mais généralement, le code appelant saura comment trier la liste.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow