1

ASP.NET MVC 4プロジェクトとSQLビュー(vvItem)があります。ItemController

    MVCAppEntities db = new MVCAppEntities();
    public ActionResult Index()
    {
        var itemqry = db.vvItem.OrderBy(s => s.name);
        //var pageditems = itemqry.Skip(10).Take(20); // 25 seconds
        return View(itemqry.ToList()); // 88 seconds
    }

Index.cshtml表示

@model IEnumerable<MVCApplication1.Models.vvItem>
@{
    var norows = 20;
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: norows);
    grid.Pager(WebGridPagerModes.NextPrevious);  
    @grid.GetHtml(tableStyle: "table",  headerStyle: "header", columns: grid.Columns(
          grid.Column(columnName: "name", header: "Name", canSort: true),
          grid.Column(columnName: "quantity", header: "Quantity", canSort: true),  
          grid.Column(columnName: "code", header: "Code", canSort: true),
          grid.Column(columnName: "Price", header: "Price", canSort: true),
          ))}

vvItemには、ほぼ400000レコードがあります。webgrid Pagerは表示されたレコードのみをロード(Take())し、次のページに移動する場合は最初のレコードをSkip()することを知っていると思いました。

Q:表示されたレコードのみをロードするビューを効率的に作成するにはどうすればよいですか?

JSONバージョンNerdDinnerの2つのソリューションが見つかりました

私はJSONがあまり得意ではないので、NerdDinnerソリューションを試しました。そして、私のコメントした行のように、 //var pageditems = itemqry.Skip(10).Take(20);itemqryにはすでにすべてのレコードがロードされており、ロードに多くの時間がかかりました。

Q2:ページングを今行うにはどうすればよいですか?ページ番号を変更する必要があります。Indexメソッドから。

public ActionResult Index(int? page, string filter1 = " ", string filter2 = " ")
4

4 に答える 4

2

SQLストアドプロシージャを作成しました

CREATE PROCEDURE SkipTake 
    @pagNo int, 
    @pageSize int
AS    
    select *
    from (select *, row_number() over (order by COD) as rn 
          from vvSTOC
         ) as T
    where T.rn between (@pagNo - 1) * @pageSize + 1 and @pagNo * @pageSize

このspを関数インポートのEFモデルに追加して、エンティティ(vvSTOC)を返すようにしました。

    public ActionResult Index(int? page)
    {
        const int pageSize = 20;
        return View(db.spSkipTake(page, pageSize).ToList());
    }
于 2012-06-19T15:57:27.860 に答える
1

itemqryがIEnumerableまたはIQueryableタイプである限り、クエリをすぐに実行しないでください。次のようにIQueryableとしてキャストできますか?

public ActionResult Index()
{
    IQueryable<vvItem> itemQry = db.vvItem;
    return View(itemQry.OrderBy(s => s.name).Skip(10).Take(20).ToList());
}

itemqryが正しいタイプの場合、.ToList()が呼び出されてIListタイプに変換されるまで実行されません。生成されているSQLを確認してください。

于 2012-06-19T12:54:52.973 に答える
0
public ActionResult Index(int? pageIndex)
{
   int pageSize = 20;
   var itemIndex = ((pageIndex??1) -1) * pageSize;

    return View(db.vvItem.OrderBy(s => s.name).Skip(itemIndex).Take(pageSize).ToList()); 
}
于 2012-06-19T18:12:27.530 に答える
0

これをありがとう。

これを微調整して、SPのいくつかの入力パラメーターを操作し、PageSize、PageNumber、SortIndex、およびSortOrderを制御しました。

declare @sql nvarchar(1000) = '
select * from
(
    select *, row_number() over(order by '+@SortIndex+' '+@SortOrder+') as RowNumber from #Results
) as T
where T.RowNumber between ('+@PageNumber+' - 1) * '+@PageSize+' + 1 and '+@PageNumber+' * '+@PageSize

exec sp_executesql @sql
于 2012-07-13T14:02:29.480 に答える