2

データベースからすべてのアイテムを取得して特定のビューモデルに変換し、PagedList ライブラリを使用してこれらすべてのデータをページングしたくありません。

たとえば、ページで 20 個のアイテムを取得したいのですが、いつモデルをビューモデルに変換する必要があるかわかりません。

これが方法です

public ViewResult Index(ProductReviewRelationalFilterViewModel filterViewModel)
{
    var items =
        _productreviewService.GetItems(filterViewModel.ProductId, filterViewModel.UserId)
                             .Select(AutoMapper.Mapper.Map<ProductReviewListViewModel>);

    var result = items.ToPagedList(filterViewModel.PageIndex, 20);

    return View(result );
}

このメソッドは、すべてのアイテムを取得し、それらを ProductReviewListViewModel に変換してからページングを行います。

私が欲しいのは、dbから20個のアイテムだけを取得し、上記と同じ結果を得ることですか?

注: GetItems メソッドは IQueryable を返します

追加されたソリューション

私はGetItemsメソッドを実行し、合計アイテム数をout intパラメーターとして返します。コントローラーのアクションでは、 StaticPagedList メソッドを使用して、このリンクのようにページングを手動で作成します

4

2 に答える 2

1

以下はテストしていませんが、これに影響するものがあります。

public ViewResult Index(ProductReviewRelationalFilterViewModel filterViewModel)
{
    var pageSize = 20;
    var skipRecords = (filterViewModel.PageIndex > 1 ? (filterViewModel.PageIndex - 1) * pageSize + (filterViewModel.PageIndex - 2) : 0);
    var items =
        _productreviewService.GetItems(filterViewModel.ProductId, filterViewModel.UserId)
                            .Skip(skipRecords).Take(pageSize)
                            .Select(AutoMapper.Mapper.Map<ProductReviewListViewModel>);

    var result = items.ToPagedList(filterViewModel.PageIndex, 20);

    return View(result );
}

式: (pageIndex > 1 ? (pageIndex - 1) * pageSize + (pageIndex - 2) : 0)

page 1 = 0 = skip 0 take 20
page 2 = (2 - 1) 1 * 20 + (2 - 2) 0 = skip 20 take 20
page 3 = (3 - 1) 2 * 20 + (3 - 2) 1 = skip 41 take 20
page 4 = (4 - 1) 3 * 20 + (4 - 2) 2 = skip 62 take 20 
page 5 = (5 - 1) 4 * 20 + (5 - 2) 3 = skip 83 take 20 

Results:
page 1 - skip 0 take 20 (shows record 0 - 20)
page 2 - skip 20 take 20 (shows record 21 - 41)
page 3 - skip 41 take 20 (shows record 42 - 62)
page 4 - skip 62 take 20 (shows record 63 - 83)

Take() と Skip() を使用して結果セットからレコードを取得する必要があることを意味する IQueryable であるため、.ToPagedList を呼び出すとクエリが実行されます。

上記の注意点の 1 つは、ToPagedList() の実装がどのように見えるかわからないということです。出力するページ リンクの数を計算できるように、クエリに一致するレコードの総数を伝える必要があると思います。 .

于 2013-06-27T03:14:15.250 に答える