3

現在、LinqtoEntitiesを使用して単純なASP.NETMVCサイトを構築しています。この世界への私の最初の進出はオタクディナーでした。そこで私は使用しようとしているページ化されたリストコードを見つけました。コードは次のようになります。

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

問題は、エンティティフレームワークを使用していることであり、上記のコードは次のエラーをスローします。

メソッド「スキップ」は、LINQtoEntitiesの並べ替えられた入力でのみサポートされます。メソッド「OrderBy」は、メソッド「Skip」の前に呼び出す必要があります。

Linqの詳細がわからないため、上記のメソッドで列名がどのようになるか、一般的なものであるかがわからない場合に、orderby句を追加する方法がわかりません。

ありがとう!

4

4 に答える 4

9

まず、自分で書くよりも無料のPagedListコードを使用することを強くお勧めします。これは、最終的に自分で発見しなければならない多くのことを考慮しており、欠点がほとんどないためです。

質問に答えるには、リストをページング関数に渡す前に並べ替える必要があります。これを動的に行う必要がある場合は、Microsoft DynamicQueryライブラリを使用できます。しかし、通常、呼び出し元のコードはリストを並べ替える方法を知っています。

于 2009-10-05T15:58:13.003 に答える
6

IOrderedQueryable<T>ではなく、引数を要求するようにコンストラクターの署名を変更できますIQueryable<T>。呼び出しコードは、注文の処理を担当します。

public PaginatedList(IOrderedQueryable<T> source, int pageIndex, int pageSize)
于 2009-10-05T15:58:04.100 に答える
4

あなたの最善の策は、クエリをに渡す前にPaginatedListクエリに順序があることを確認することだと思います。

于 2009-10-05T15:56:51.883 に答える
2

メソッドに別のパラメーターを追加して、呼び出し元が OrderBy 句を定義できるようにすることもできます。

public PaginatedList(IQueryable<T> source, Func<T, TKey> orderBy, 
    int pageIndex, int pageSize)
{
    // your other code here
    this.AddRange(source.OrderBy(orderBy)
        .Skip(pageIndex * pageSize)
        .Take(pageSize));
}
于 2009-10-05T15:59:32.130 に答える