1

我有一个 ASP.NET MVC 4 项目和一个 SQL 视图 (vvItem)。项目控制器

    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() 第一个记录。

:如何有效地使视图仅加载显示的记录?

我找到了 2 个解决方案:JSON 版本NerdDinner

我不太擅长 JSON,所以我尝试了 NerdDinner 解决方案。正如我评论的行 //var pageditems = itemqry.Skip(10).Take(20);itemqry 已经加载了所有记录,加载需要很长时间。

Q2:我现在如何进行分页?我需要修改页码。从索引方法。

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

我在函数导入的 EF 模型中添加了这个 sp,以便它返回一个实体 (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 回答