Linq选择记录范围
这将返回所有关联的记录,我如何选择最好的方式,比如只选择记录#10到#20,这样我就不会加载任何冗余数据Linq选择记录范围,linq,sql-server-2008,pagination,paging,Linq,Sql Server 2008,Pagination,Paging,这将返回所有关联的记录,我如何选择最好的方式,比如只选择记录#10到#20,这样我就不会加载任何冗余数据 var q = (from Comments in db.tblBlogComments where Comments.blogID == this.ID orderby Comments.date descending select new { Comments.userID, Comments.comment, Comments.date }); 我不确
var q = (from Comments in db.tblBlogComments where Comments.blogID == this.ID orderby Comments.date descending select new {
Comments.userID, Comments.comment, Comments.date
});
我不确定
Skip
是否转换为在数据库中执行的SQL,因此这可能不是很有效。您可以在结果集中使用.Skip()
和.Take()
方法。例如:
int start = 10;
int end = 20;
var q = (from Comments in db.tblBlogComments
where Comments.blogID == this.ID
orderby Comments.date descending
select new {
Comments.userID,
Comments.comment,
Comments.date
}).Skip(start).Take(end - start);
然后使用:
var q = (from Comments in db.tblBlogComments where Comments.blogID == this.ID orderby Comments.date descending select new {
Comments.userID, Comments.comment, Comments.date
});
然后
int pageSize = 10;
int page = 3;
var currentPage = q.Skip((currentPage - 1) * pageSize).Take(pageSize);
由于Linq使用延迟执行,实际查询将在foreach循环期间创建和执行。因此SQL查询将只返回当前页面的记录
编辑:怎么样:
foreach(var item in currentPage)
{
...
}
我假设Comments.ID与该记录中存储的ID字段无关?是的,如果我没有说清楚,很抱歉,但它是用来选择范围的,这是用于分页的,因此如果它返回100条记录,如果我在第3页,我只需要20-30条记录。如果这是有意义的。当有数千条记录时,这会是低效的吗?我不想在我永远不会使用它们的时候将它们加载到内存中。@Tom-除非您专门将它们转储到列表或数组中,否则linq一次只在内存中加载一条记录。不过,您必须通过网络传输它们。为了解决您对性能的担忧。。。这完全取决于LINQ提供程序,但是对于底层数据提供程序,Skip和Take通常以最有效的方式实现。例如,在SQL 2005/2008中,这可能会转换为一个ROW_NUMBER()排名表达式。您可以在中找到实际的转换,看起来它使用了一个嵌套查询。@tvanfosson:也许在这个Skip(1)中,以LINQ-SQL为例,它使用带TOP的子查询,但我也看到过带排名表达式的子查询。
var q = (
from Comments in db.tblBlogComments
where Comments.blogID == this.ID
orderby Comments.date descending
select new { Comments.userID, Comments.comment, Comments.date }).Skip(10).Take(10);