当我在 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/