JK.*_*JK. 8 c# ienumerable orm deferred-execution dapper
当我在Dapper中执行查询并且只想要检索一个记录块时,我可以使用.Skip().Take(),还是需要在SQL中使用select top n*?
例如,给定一个包含10,000条记录的表,我只想要前200条,因为我的列表页面每页只显示200条.我跑这个吗?
conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);
Run Code Online (Sandbox Code Playgroud)
或这个:
conn.Query<Widget>("select top 200 * from Widgets");
Run Code Online (Sandbox Code Playgroud)
Dapper的.Query<T>方法是否延期?
Ere*_*mez 10
你应该用SELECT TOP n....
该Query<T>方法有一个可选参数bool buffered = true,当true循环遍历完整的结果集时,将每一行读入一个List<T>.你可以把这个参数设置为false,并导致IEnumerable<T>在这个意义上,直到你用它的数据库查询将不会被执行将"延期",行会从DB方"一次一个"被检索(调用IDataReader.Read上每次迭代).
所以,是的,它可以"推迟".但是,您仍然应该使用TOP n,否则您仍然会在db端执行并准备10000个记录的结果集,尽管您可能只将前n行传输到客户端.