Linq 到实体 Skip() 和 Take()

Posted

技术标签:

【中文标题】Linq 到实体 Skip() 和 Take()【英文标题】:Linq to Entities Skip() and Take() 【发布时间】:2012-06-12 14:29:47 【问题描述】:

我正在开发一个 ASP.NET 应用程序,我正在创建一个 LINQ 查询,它将从 db 中选择分页记录。在用户界面上,我有一个列表框,用户可以在其中选择多个选项。我想知道:

如何增加 Skip()、Take() 参数以查看下一个结果?

如何使用“IN”关键字,以便用户从列表框中选择多个选项时,查询可以检查所有值?

我的查询如下所示:

var searchResults = context.data_vault.Where(d => d.STATE == lstStates.SelectedItem.Text).OrderBy(d= > d.dv_id).Take(10).Skip(2);    
GridView1.DataSource = searchResults;
GridView1.DataBind();

【问题讨论】:

你需要先调用skip再取。在您当前的实现中,您将始终检索项目 3 到 10,因为您会获取前 10 项,而您会跳过前两项。要递增,您只需将 skip 的值作为参数提供给执行查询的方法。 【参考方案1】:

我认为您使用 Skip 不正确。它应该在 Take 之前。

Skip 会跳过许多记录,因此对于您的第一页,传入 0,否则传入 (页码 - 1) * 每页记录。

我通常会这样做:

int Page = 1;
int RecordsPerPage = 10;
var q = yourQuery.Skip((Page - 1) * RecordsPerPage).Take(RecordsPerPage);

【讨论】:

【参考方案2】:

您需要先打开 GridView 的分页。然后在PageIndexChanging事件上:

var result = db.Where(...)
               .Skip(e.NewPageIndex * grid.PageSize)
               .Take(grid.PageSize)
               .ToList(); // this is very important part too

模仿IN的行为:

var selection = list.SelectedItems.Select(i => i.Text).ToArray();
var result = db.Where(x => selection.Contains(x.Prop));

【讨论】:

在第二个查询中添加右括号。 db.Where(x => selection.Contains(x.Prop)); @abatishchev 在页面加载时我需要写什么? @DotnetSparrow:将列表绑定到 GridView。然后它会自己进行分页。 但它会减慢速度,因为在页面加载时它会带来所有记录? @DotnetSparrow:不,EF 会限制查询结果。当然,它会比手动限制效率低(这是 SQL Server 的一个已知问题)。【参考方案3】:

试试这个:

   int temp = (CurrentPageNumber - 1) * 10;
    var searchResults = context.data_vault.Where(d => d.STATE == lstStates.SelectedItem.Text).OrderBy(d= > d.dv_id).Skip(temp).Take(10);

【讨论】:

以上是关于Linq 到实体 Skip() 和 Take()的主要内容,如果未能解决你的问题,请参考以下文章

Linq:使用Take和Skip实现分页

使用 Linq Skip Take 进行传统 SQL 查询,而不是使用 RowNum

LinQ中Skip()方法和Take()方法的使用

LINQ 查询添加 orderby 使 Skip 和 Take 不起作用 Linqpad

Linq 使用skip和take分页

Linq 使用skip和take分页