db.Database.SqlQuery<>().ToPagedList()

db.Database.SqlQuery<>().ToPagedList()

当我使用时:

var result = db.votes.ToPagedList(pageNumber, pageSize);

result 从数据库中获取 [pageSize] 行,性能良好 未发送到数据库 “select * 来自 table”

但是当我使用时:

var q2 = SELECT * FROM [dbname].[dbo].[v1] ";

var result = db.Database.SqlQuery<ISMS>(q2).ToPagedList(pageNumber, pageSize);

result 捕获内存中数据库中的所有行,然后将其转换为分页列表并 它非常慢,因为(向数据库发送查询是'select * from table')

我用 sqlServer profiler 监控所有。

但是我想使用 db.Database.SqlQuery 出于很多原因并且性能良好 我该怎么做?

我的测试:

1.var result = db.Database.SqlQuery<ISMS>(q2).AsQueryable().ToPagedList(pageNumber, pageSize);

它还会发送‘select * from table’到数据库

2.

var q = string.Format("SELECT *  FROM [dbname].[dbo].[{0}] " +
    "ORDER BY id " +
    "OFFSET  {1} ROWS " +
    "FETCH NEXT {2} ROWS ONLY ", tablename , 20 * (page - 1), 20);

但是我用上面的时候不能在视图中使用@Html.PagedListPager

当您向 PagedList 传递一个 IQueryable 时,它的效果最好,因为它会知道如何根据您的页面和页面大小生成需要发送到数据库的查询。

使用 SqlQuery 意味着您自己对数据库执行,然后将结果(已在内存中)传递给 PagedList

如果您有兴趣使用 SqlQuery,您需要自己处理分页。

您应该select 仅从数据库中获取所需的行。

例如:

`WITH Orderedtable AS ( SELECT 某事 ROW_NUMBER() OVER (ORDER BY something) AS 'RowNumber' 来自 table )

SELECT * FROM 订购table WHERE RowNumber BETWEEN 1000 AND 2000`

其中 1000 是起始记录数,2000 是结束记录数。