【问题标题】:Does Dapper's IEnumerable<T> have deferred or immediate execution?Dapper 的 IEnumerable<T> 是否已延迟或立即执行?
【发布时间】:2013-10-19 00:16:45
【问题描述】:

当我在 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&lt;T&gt; 方法是否延迟?

【问题讨论】:

    标签: c# orm ienumerable dapper deferred-execution


    【解决方案1】:

    你应该使用SELECT TOP n...

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

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

    【讨论】:

    • 当 buffer 设置为 false 你必须担心连接。如果在“ToList”(或推荐的 AtList)之前关闭它,它将失败并出现错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2015-08-11
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多