当我在Dapper中执行查询并且只想检索一个记录块时,我可以使用.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>
方法是否被推迟?
答案 0 :(得分:10)
您应该使用SELECT TOP n...
。
Query<T>
方法有一个可选参数bool buffered = true
,当true循环遍历完整结果集时,将每行读取到List<T>
。您可以将此参数设为false,结果IEnumerable<T>
将被“延迟”,因为db查询在您使用之前不会执行,并且将从数据库端检索行“时间“(每次迭代调用IDataReader.Read
)。
所以,是的,它可以“推迟”。但是,您仍然应该使用TOP n
,否则您仍然会在db端执行和准备10000条记录的结果集,尽管您可能只将前n行传输到客户端。