2013-10-19 30 views
7

当我在Dapper中执行查询并且只想检索一个记录块时,我可以使用.Skip()。Take(),还是我需要在SQL中使用select top n *?Dapper的IEnumerable <T>是否延期或立即执行?

例如给定一张有10,000条记录的表格,我只希望前200个,因为我的列表页面只显示每页200个。我运行这个吗?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size); 

或者这样:

conn.Query<Widget>("select top 200 * from Widgets"); 

短小精悍的.Query<T>方法推迟或不?

回答

8

您应该使用SELECT TOP n...

Query<T>方法有一个可选参数bool buffered = true,当真循环遍历整个结果集时,读取每行到List<T>。你可以使这个参数为false,并且得到的IEnumerable<T>将被“延迟”,因为直到你使用db查询才会被执行,并且这些行将从数据库端“一次一个”地被调用(调用每次迭代时为IDataReader.Read)。

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