Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ: Add RowNumber Column

Tags:

c#

.net

linq

How can the query below be modified to include a column for row number (ie: one-based index of results)?

var myResult = from currRow in someTable                where currRow.someCategory == someCategoryValue                orderby currRow.createdDate descending                select currRow; 

EDIT1: I'm looking for the results to be {idx, col1, col2...col-n} not {idx, row}.

EDIT2: The row number should correspond to result rows not the table rows.

EDIT3: I DataBind these results to a GridView. My goal was to add a row number column to the GridView. Perhaps a different approach would be better.

like image 790
Steven Avatar asked Feb 19 '13 15:02

Steven


People also ask

Is Linq generic?

LINQ queries are based on generic types, which were introduced in version 2.0 of . NET Framework. You do not need an in-depth knowledge of generics before you can start writing queries.


1 Answers

Use the method-syntax where Enumerable.Select has an overload with the index:

var myResult = someTable.Select((r, i) => new { Row = r, Index = i })     .Where(x => x.Row.someCategory == someCategoryValue)     .OrderByDescending(x => x.Row.createdDate); 

Note that this approach presumes that you want the original index of the row in the table and not in the filtered result since i select the index before i filter with Where.

EDIT: I'm looking for the results to be {idx, col1, col2...col-n} not {idx, row}. The row number should correspond to result rows not the table rows.

Then select the anonymous type with all columns you need:

var myResult = someTable.Where(r => r.someCategory == someCategoryValue)         .OrderByDescending(r => r.createdDate)         .Select((r, i) => new { idx = i, col1 = r.col1, col2 = r.col2, ...col-n = r.ColN }); 
like image 62
Tim Schmelter Avatar answered Oct 03 '22 21:10

Tim Schmelter