了解 PagedList mvc 和 Entity Framework(慢查询)
Understanding PagedList mvc and Entity Framework (Slow Queries)
我在 MySQL 数据库中有一个 table,有几千条记录。在我的网页上,我使用 PagedList 一次显示 10 条记录。我一般这样称呼数据。
using (var ctx = new mydbEntities())
{
var customers = ctx.customers.OrderBy(o => o.ID).ToPagedList(1,10);
}
如果我要查看它生成的 SQL,我说 ToPagedList 只会 select 数据库中的 10 行而不是 return 获取之前的所有内容是否正确结果十?
在某些情况下,我使用原始 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);
}
我想这会 return 应用分页之前的所有记录?
有没有一种有效的方法可以将使用 PagedList 的分页应用于后一个示例?
谢谢大家。
我认为为了更好地帮助您解决您的问题,最好看一下
在为两个查询生成的 sql 处。
根据我在 PagedList 的 Repo 上看到的内容:
它将对数据库进行 2 次调用:
- 将对提供的查询进行计数
- 将采用正确的方式进行实际查询并跳过。
现在你的第二个查询,如果你想获得更好的性能,将代码编写为原始 sql 查询可能更有效,以实现 @Ivan Stoev 指出的分页功能。
无论哪种方式,当您使用 PagedList 库时,这两个查询都会执行两次。
请注意,使用 .Database.SqlQuery<customer>
时,您获得的结果不会缓存在 Entity Framework 中,即使它们是有效的实体对象也不会被跟踪。
有关以下检查的更多信息:
var customers = ctx.customers.OrderBy(o => o.ID).ToPagedList(1,10);
有了这个查询; Linq to entities 将查询翻译为类似 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 服务器获取,并开始检索记录。因此,所需的 OrderBy
和 Pagination
操作在内存中执行。
这里有两个选项;
使用 Linq To Entity 查询并翻译 ToPagedList
IQueryable
形式
或修改 strQry
查询以使用类似的方式执行排序和分页
select * from table order by cl1 OFFSET x ROWS FETCH NEXT y ROWS ONLY
我在 MySQL 数据库中有一个 table,有几千条记录。在我的网页上,我使用 PagedList 一次显示 10 条记录。我一般这样称呼数据。
using (var ctx = new mydbEntities())
{
var customers = ctx.customers.OrderBy(o => o.ID).ToPagedList(1,10);
}
如果我要查看它生成的 SQL,我说 ToPagedList 只会 select 数据库中的 10 行而不是 return 获取之前的所有内容是否正确结果十?
在某些情况下,我使用原始 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);
}
我想这会 return 应用分页之前的所有记录?
有没有一种有效的方法可以将使用 PagedList 的分页应用于后一个示例?
谢谢大家。
我认为为了更好地帮助您解决您的问题,最好看一下 在为两个查询生成的 sql 处。
根据我在 PagedList 的 Repo 上看到的内容:
它将对数据库进行 2 次调用:
- 将对提供的查询进行计数
- 将采用正确的方式进行实际查询并跳过。
现在你的第二个查询,如果你想获得更好的性能,将代码编写为原始 sql 查询可能更有效,以实现 @Ivan Stoev 指出的分页功能。
无论哪种方式,当您使用 PagedList 库时,这两个查询都会执行两次。
请注意,使用 .Database.SqlQuery<customer>
时,您获得的结果不会缓存在 Entity Framework 中,即使它们是有效的实体对象也不会被跟踪。
有关以下检查的更多信息:
var customers = ctx.customers.OrderBy(o => o.ID).ToPagedList(1,10);
有了这个查询; Linq to entities 将查询翻译为类似 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 服务器获取,并开始检索记录。因此,所需的 OrderBy
和 Pagination
操作在内存中执行。
这里有两个选项;
使用 Linq To Entity 查询并翻译
ToPagedList
IQueryable
形式或修改
strQry
查询以使用类似的方式执行排序和分页select * from table order by cl1 OFFSET x ROWS FETCH NEXT y ROWS ONLY