Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq to Entities Skip() and Take()

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();
like image 483
DotnetSparrow Avatar asked Jun 08 '12 14:06

DotnetSparrow


People also ask

How do you use take and skip in LINQ?

The Take operator is used to return a given number of elements from an array and the Skip operator skips over a specified number of elements from an array. Skip, skips elements up to a specified position starting from the first element in a sequence.

What is any () in LINQ?

The Any operator is used to check whether any element in the sequence or collection satisfy the given condition. If one or more element satisfies the given condition, then it will return true. If any element does not satisfy the given condition, then it will return false.

How do I concatenate in LINQ query?

In LINQ, the concatenation operation contains only one operator that is known as Concat. It is used to append two same types of sequences or collections and return a new sequence or collection. It does not support query syntax in C# and VB.NET languages. It support method syntax in both C# and VB.NET languages.

What is Skip method in C#?

Use the Skip() method in C# to skip number of elements in an array. Let's say the following is our array − int[] arr = { 10, 20, 30, 40, 50 }; To skip the first two elements, use the Skip() method and add argument as 2 − arr.Skip(2);


3 Answers

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);
like image 98
Neil N Avatar answered Oct 16 '22 19:10

Neil N


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));
like image 37
abatishchev Avatar answered Oct 16 '22 19:10

abatishchev


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);
like image 34
Kapil Khandelwal Avatar answered Oct 16 '22 19:10

Kapil Khandelwal