Там нет простого способа, если хочет сохранить плоский список столбцов (т.е.OP Edit2), а также хотите, чтобы общее решение работало с любым IEnumerable, не требуя, чтобы вы отображали список ожидаемых столбцов.
Однако существует окольный путь к тому, чтобы просмотреть данные запроса в DataTable с помощью метода ToDataTable() от here, а затем добавить столбец RowNumber в эту таблицу.
var table = query.ToList().ToDataTable();
table.Columns.Add("RowNum", typeof(int));
int i = 0;
foreach (DataRow row in table.Rows)
row["RowNum"] = ++i;
Это может вызвать проблемы с производительностью с большими наборами данных, но это также не безумно медленное. На моей машине набор данных с ~ 6500 строк занял 33 мс для обработки.
Если ваш первоначальный запрос возвратил анонимный тип, тогда определение этого типа будет потеряно при преобразовании, поэтому вы потеряете статическую типизацию имен столбцов результирующего IEnumerable при вызове таблицы. AsEnumerable(). Другими словами, вместо того, чтобы писать что-то вроде table.AsEnumerable(). First() .RowNum вам нужно написать таблицу.AsEnumerable(). First() ["RowNum"]
Однако, если вы не заботятся о производительности и действительно хотят, чтобы ваша статическая печать возвращалась, тогда вы можете использовать JSON.NET для преобразования DataTable в строку json, а затем обратно в список на основе анонимного типа из исходного результата запроса. Этот метод требует наличия поля RowNum заполнителя в исходных результатах запроса.
var query = (from currRow in someTable
where currRow.someCategory == someCategoryValue
orderby currRow.createdDate descending
select new { currRow.someCategory, currRow.createdDate, RowNum = -1 }).ToList();
var table = query.ToDataTable();
//Placeholder RowNum column has to already exist in query results
//So not adding a new column, but merely populating it
int i = 0;
foreach (DataRow row in table.Rows)
row["RowNum"] = ++i;
string json = JsonConvert.SerializeObject(table);
var staticallyTypedList = JsonConvert.DeserializeAnonymousType(json, query);
Console.WriteLine(staticallyTypedList.First().RowNum);
Это добавило около 120 мс к времени обработки для моего набора данных 6500 элементов.
Это сумасшедший, но он работает.
Возможный дубликат [Как добавить индексное поле к результатам Linq] (http://stackoverflow.com/questions/269058/how-do-you-add-an-index-field-to-linq-results) – sloth
Вы хотите индекс строки в таблице или индекс отфильтрованного результата? –
Возможный дубликат [добавления индекса к результату запроса linq] (http://stackoverflow.com/questions/4999365/adding-index-to-linq-query-result) – sloth