c# - Dapper 的 IEnumerable<T> 是延迟执行还是立即执行?

标签 c# orm ienumerable dapper deferred-execution

当我在 Dapper 中执行查询时,只想检索一个记录 block ,我可以使用 .Skip().Take(),还是需要在 SQL 中使用 select top n *?

例如,给定一个包含 10,000 条记录的表,我只想要前 200 条,因为我的列表页面每页只显示 200 条。我运行这个吗?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);

或者这个:

conn.Query<Widget>("select top 200 * from Widgets");

是 Dapper 的 .Query<T>方法是否延迟?

最佳答案

你应该使用 SELECT TOP n... .

Query<T>方法有一个可选参数 bool buffered = true , 当 true 循环遍历整个结果集时,将每一行读入 List<T> .您可以将此参数设置为 false,并生成 IEnumerable<T>在数据库查询直到您使用它之前不会执行的意义上将被“延迟”,并且行将“一次一个”从数据库端检索(每次迭代调用IDataReader.Read)。

所以,是的,它可以“延迟”。但是,您仍应使用 TOP n因为否则你仍然会在数据库端执行并准备 10000 条记录的结果集,尽管你可能只将这些记录的前 n 行传输到客户端。

关于c# - Dapper 的 IEnumerable<T> 是延迟执行还是立即执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460853/

相关文章:

c# - 从c#读取ldap组成员

c# - Azure AD graph api 在本地工作但在部署时失败

Node.js - 具有分层数据支持的 ORM

php - Laravel Eloquent 根据关系字段只检索某些行

c# - 为什么 IEnumerable<T> 继承自 IEnumerable?

c# - foreach 获取下一个项目

c# - 分组输出集合中的项目

c# - 将值从子窗口传递回 MainPage

mysql - 如何在Sequelize JS中更新reference_id(FK列)中具有相同值的对象数组?

c# - 无法删除 TableLayoutPanel 中控件之间的间距?