在LINQ中按顺序对每组的行进行编号

本文关键字:编号 LINQ 顺序 | 更新日期: 2023-09-27 18:05:49

假设您有列AppleType, CreationDate,并希望按CreationDate对每组AppleType进行排序。此外,您还需要创建一个新列,该列显式地根据AppleType对CreationDate进行排序。

因此,结果数据集将有三列,AppleType, CreationDate, orderimported。

是否有LINQ的方法来做到这一点?我实际上要通过编程的数据(但不是通过LINQ),创建一个数组,转换为一列,并添加到数据集?我有一个LINQ方法来做这个。如果可能,请使用LINQ非方法语法

在LINQ中按顺序对每组的行进行编号

那么这些值实际上是按照正确的顺序出现的吗?如果是这样,这很容易——但是确实需要使用方法语法,因为查询表达式语法不支持相关的重载:

var queryWithIndex = queryWithoutIndex.Select((x, index) => new
                                              {
                                                  x.AppleType,
                                                  x.CreationDate,
                                                  OrderIntroduced = index + 1,
                                              });

(假设您希望OrderIntroduced从1开始)

我不知道你怎么把它放回DataSet -但是你真的需要它在DataSet而不是在强类型序列中吗?

编辑:好的,需求仍然不清楚,但我认为你想要这样的东西:
var query = dataSource.GroupBy(x => x.AppleType)
     .SelectMany(g => g.OrderBy(x => x.CreationDate)
                       .Select((x, index ) => new {
                               x.AppleType,
                               x.CreationDate,
                               OrderIntroduced = index + 1 }));

注意:这里的GroupBySelectMany调用可以放在查询表达式语法中,但我相信在这种情况下它会变得更加混乱。这两种形式都值得使用。

如果你想要一个纯Linq to Entities/SQL解决方案,你可以这样做:

修改以处理重复的creatationdate

var query = from a in context.AppleGroup
            orderby a.CreationDate
            select new
            {
              AppleType = a.AppleType,
              CreationDate = a.CreationDate,
              OrderIntroduced = (from b in context.AppleGroup
                                 where b.CreationDate < a.CreationDate
                                 select b).Count() + 1
            };