Dapper的IEnumerable <t>是否已推迟或立即执行?</t>

时间:2013-10-19 00:16:46

标签: c# orm ienumerable dapper deferred-execution

当我在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>方法是否被推迟?

1 个答案:

答案 0 :(得分:10)

您应该使用SELECT TOP n...

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

所以,是的,它可以“推迟”。但是,您仍然应该使用TOP n,否则您仍然会在db端执行和准备10000条记录的结果集,尽管您可能只将前n行传输到客户端。