Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq选择记录范围_Linq_Sql Server 2008_Pagination_Paging - Fatal编程技术网

Linq选择记录范围

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 }); 我不确

这将返回所有关联的记录,我如何选择最好的方式,比如只选择记录#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
    });

我不确定
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);