了解pagedlist mvc和实体框架(慢速查询)

sshcrbum  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(500)

我在mysql数据库中有一个表,有几千条记录。在我的网页上,我用pagedlist一次显示10条记录。我通常这样称呼数据。

using (var ctx = new mydbEntities())
{
    var customers = ctx.customers.OrderBy(o => o.ID).ToPagedList(1,10);
}

如果我看一下它生成的sql,我说topagedlist只从数据库中选择10行,而不是在从结果中选择10行之前返回所有内容,这是正确的吗?
在某些情况下,我使用原始sql,因为查询非常复杂,并且根据特定条件将其构建为字符串。一个简单的例子。

using (var ctx = new mydbEntities())
{
    List<MySqlParameter> parameters = new List<MySqlParameter>();
    string strQry = "select * from visitor;";                
    var customers = ctx.Database.SqlQuery<customer>(strQry, parameters.ToArray()).OrderByDescending(o => o.ID).ToPagedList(1,10);
}

我想这会在应用分页之前返回所有记录吗?
有没有一种有效的方法可以将使用pagedlist的分页应用于后一个示例?
谢谢你们。

kzmpq1sx

kzmpq1sx1#

我认为,为了更好地帮助您解决问题,最好看看为这两个查询生成的sql。
从我在pagedlist的repo上看到的:
dncuug/x.pagedlist页面列表
troygoode.页面列表
它将对数据库进行2次调用:
将对提供的查询进行计数
将使用正确的take和skip进行实际查询。
现在是第二个查询如果您想获得更好的性能,那么将代码编写为原始sql查询以生成@ivan stoev所指出的分页函数可能会更有效。
无论哪种方式,当您使用pagedlist库时,这两个查询都将执行两次。
但在使用 .Database.SqlQuery<customer> 您得到的结果不会缓存在实体框架中,即使它们是有效的实体对象,也不会被跟踪。有关该检查的更多信息,请参见以下内容:
database.sqlquery方法
dbrawsqlquery类

xhv8bpkk

xhv8bpkk2#

var customers = ctx.customers.OrderBy(o => o.ID).ToPagedList(1,10);

使用此查询;linqto实体将查询转换为 select * from customers order by ID OFFSET 1 ROWS FETCH NEXT 10 ROWS ONLY 这就是你想要的。

var customers = ctx.Database.SqlQuery<customer>(strQry, parameters.ToArray()).OrderByDescending(o => o.ID).ToPagedList(1,10);

使用此查询;这个 strQry sql server已获取查询并开始检索记录。所以,想要的 OrderBy 以及 Pagination 动作在内存中执行。
这里有两种选择;
使用linq进行实体查询和转换 ToPagedListIQueryable 形式
或修改 strQry 使用类似的查询来执行排序和分页 select * from table order by cl1 OFFSET x ROWS FETCH NEXT y ROWS ONLY

相关问题