C# Dapper的IEnumerable是否延迟或立即执行?
当我在Dapper中执行查询并且只想检索一个记录块时,我可以使用.Skip.Take,还是需要在SQL中使用select top n* 例如,给定一个有10000条记录的表,我只想要前200条记录,因为我的列表页每页只显示200条记录。我运行这个吗C# Dapper的IEnumerable是否延迟或立即执行?,c#,orm,ienumerable,dapper,deferred-execution,C#,Orm,Ienumerable,Dapper,Deferred Execution,当我在Dapper中执行查询并且只想检索一个记录块时,我可以使用.Skip.Take,还是需要在SQL中使用select top n* 例如,给定一个有10000条记录的表,我只想要前200条记录,因为我的列表页每页只显示200条记录。我运行这个吗 conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size); 或者这个: conn.Query<Widget>("select
conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);
或者这个:
conn.Query<Widget>("select top 200 * from Widgets");
Dapper的.Query方法是否延迟?您应该使用SELECT TOP n
Query方法有一个可选参数bool buffered=true,当true遍历完整的结果集时,它会将每一行读取到一个列表中。您可以将此参数设为false,生成的IEnumerable将被延迟,因为在使用db查询之前不会执行该查询,并且在每次迭代中调用IDataReader.Read从db端一次检索一行
所以,是的,可以推迟。但是,您仍然应该使用TOP n,因为否则您仍然会在db端执行和准备10000条记录的结果集,尽管您可能只将这些记录的前n行传输到客户端。当缓冲区设置为false时,您必须担心连接。如果在登录或推荐的AtList之前关闭它,它将失败并出现错误。