2012-06-08 114 views
8

我正在研究ASP.NET应用程序,我正在创建一个LINQ查询,它将从数据库中选择分页记录。在用户界面我有一个列表框,用户可以选择多个选项。我想知道:Linq to Entities Skip()和Take()

  • 如何增加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(); 
+0

您需要首先调用跳过再取。在你目前的实施中,你会一直检索项目3到10,因为你拿到了前10项,而那些你跳过前两项。为了递增,只需要将跳转的值作为参数提供给执行查询的方法。 – Franky

回答

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

+0

@NhhilAgrawal:谢谢。 – abatishchev

+2

downvoter是否在意评论? – abatishchev

19

我认为你正在使用跳过不正确。它应该在Take之前。

跳过一些记录,所以对于你的第一页,传递0,否则传递每页(页码-1)*记录。

我平时做这样的事情:

int Page = 1; 
int RecordsPerPage = 10; 
var q = yourQuery.Skip((Page - 1) * RecordsPerPage).Take(RecordsPerPage); 
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);