Linq to Entities Skip() 和 Take()

11

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

  • 如何递增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,然后再调用take。在你当前的实现中,你总是会检索到第3到第10个项目,因为你取了前10个项目,然后跳过前两个。要增加,你只需要将skip的值作为参数提供给执行查询的方法。 - Franky
3个回答

22

我认为你在使用Skip时有误。它应该放在Take之前。

Skip跳过一定数量的记录,所以对于第一页,传入0,否则传入(page number-1)*每页记录数。

我通常会这样做:

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

7

您需要首先在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));

1
在第二个查询中添加闭合括号。db.Where(x => selection.Contains(x.Prop)); -> db.Where(x => selection.Contains(x.Prop));} - Nikhil Agrawal
@abatishchev 我需要在页面加载时写什么? - DotnetSparrow
@DotnetSparrow:将列表绑定到GridView上,它将自动执行分页。 - abatishchev
@DotnetSparrow:不,EF会限制查询结果。当然,它的效率比手动限制要低(这是SQL Server已知的问题)。 - abatishchev
另外,我发现 list.selectedItems 不存在,而 var selection = list.SelectedItems.Select(i => i.Text).ToArray(); 可以实现相同的功能。 - DotnetSparrow
显示剩余5条评论

1

试试这个:

   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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接