如果想要保持列的平面列表(即 OP 的 Edit2)并且还想要一个通用的解决方案,该解决方案可以与任何 IEnumerable 一起使用,而无需您列出预期列的集合,则没有直接的方法。
但是,有一种迂回的方法可以解决这个问题,即使用 ToDataTable() 方法从此处将查询结果转储到 DataTable 中,然后将 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 毫秒来处理。
如果您的原始查询返回一个匿名类型,那么该类型定义将在转换中丢失,因此当您调用 table.AsEnumerable() 时,您将丢失生成的 IEnumerable 的列名上的静态类型。换句话说,您不必编写 table.AsEnumerable().First().RowNum 之类的东西,而是必须编写 table.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);
这为我的 6500 个项目数据集增加了大约 120 毫秒的处理时间。
这很疯狂,但它有效。