11

I am working on an ASP.NET application and I am creating a LINQ query which will select paginated records from db. on user interface I have a listbox where user can select multiple choices. I want to know:

  • How can I increment Skip(), Take() parameters to view next results ?

  • How can I use "IN" key word so that if user selects multiple options from listbox, query can check all values ?

My query looks like this:

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();
abatishchev
  • 98,240
  • 88
  • 296
  • 433
DotnetSparrow
  • 27,428
  • 62
  • 183
  • 316
  • You need to first call skip and then take. In your current implementation you will always retrieve the items 3 to 10, because you take the first 10 and from those you skip the first two. To increment you only need to supply the value for skip as a parameter to your method where the query is executed. – Franky Jun 08 '12 at 14:16

3 Answers3

22

I think you are using Skip incorrectly. It should be before the Take.

Skip skips a number of records, so for your first page, pass in 0, else pass in the (page number - 1) * records per page.

I usually do something like this:

int Page = 1;
int RecordsPerPage = 10;
var q = yourQuery.Skip((Page - 1) * RecordsPerPage).Take(RecordsPerPage);
Neil N
  • 24,862
  • 16
  • 85
  • 145
7

You need to turn paging on the GridView first. Then on PageIndexChanging event:

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

To emulate IN behavior:

var selection = list.SelectedItems.Select(i => i.Text).ToArray();
var result = db.Where(x => selection.Contains(x.Prop));
abatishchev
  • 98,240
  • 88
  • 296
  • 433
1

Try this:

   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);
Kapil Khandelwal
  • 15,958
  • 2
  • 45
  • 52