首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ:添加RowNumber列

LINQ:添加RowNumber列
EN

Stack Overflow用户
提问于 2013-02-19 23:00:23
回答 6查看 57.5K关注 0票数 30

如何将下面的查询修改为包含行号的列(即:基于一的结果索引)?

代码语言:javascript
复制
var myResult = from currRow in someTable
               where currRow.someCategory == someCategoryValue
               orderby currRow.createdDate descending
               select currRow;

EDIT1:我希望结果是{idx, col1, col2...col-n},而不是{idx, row}

EDIT2:行号应该对应于结果行,而不是表行。

EDIT3:我将这些结果DataBind到一个GridView。我的目标是在GridView中添加一个行号列。也许另一种方法会更好。

EN

回答 6

Stack Overflow用户

发布于 2013-02-19 23:07:13

为了好玩,这里有一个Select的替代方案,有两个参数:

代码语言:javascript
复制
var resultsWithIndexes = myResult.Zip(Enumerable.Range(1, int.MaxValue - 1),
                                      (o, i) => new { Index = i, Result = o });
票数 3
EN

Stack Overflow用户

发布于 2013-02-19 23:04:15

关于?

代码语言:javascript
复制
int i;
var myResult = from currRow in someTable
           where currRow.someCategory == someCategoryValue
           orderby currRow.createdDate descending
           select new {Record = i++, currRow};
票数 2
EN

Stack Overflow用户

发布于 2016-07-08 08:07:53

如果想要保持一个列的平面列表(即OP的Edit2),并且还想要一个通用的解决方案来处理任何IEnumerable,而不需要列出期望的列的集合,那么就没有简单的方法。

但是,有一种间接的方法,即使用here中的ToDataTable()方法将查询结果转储到DataTable中,然后将RowNumber列添加到该表中。

代码语言:javascript
复制
var table = query.ToList().ToDataTable();
table.Columns.Add("RowNum", typeof(int));
int i = 0;
foreach (DataRow row in table.Rows)
    row["RowNum"] = ++i;

这可能会导致大型数据集的性能问题,但它也不是非常慢。在我的机器上,一个大约有6500行的数据集需要33ms来处理。

如果原始查询返回匿名类型,则该类型定义将在转换中丢失,因此在调用table.AsEnumerable()时将丢失对结果IEnumerable的列名的静态类型。换句话说,您不能编写像table.AsEnumerable().First().RowNum这样的代码,而必须编写table.AsEnumerable().First()"RowNum“。

但是,如果您不关心性能,并且确实希望恢复静态类型,那么可以使用JSON.NET将DataTable转换为json字符串,然后再转换回基于原始查询结果中的匿名类型的列表。此方法要求在原始查询结果中存在占位符RowNum字段。

代码语言:javascript
复制
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项数据集增加了大约120ms的处理时间。

这很疯狂,但它是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14960563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档