C# 组内排序 LINQ

public class Order
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; } // 分区字段(PARTITION BY)
    public DateTime OrderDate { get; set; } // 排序字段(ORDER BY)
    public decimal Amount { get; set; }
}
private void button3_Click(object sender, EventArgs e)
{
    // 模拟订单数据
    var orders = new List<Order>
    {
        new Order { OrderId = 1, CustomerId = 100, OrderDate = new DateTime(2023, 1, 5), Amount = 200 },
        new Order { OrderId = 2, CustomerId = 100, OrderDate = new DateTime(2023, 1, 3), Amount = 150 },
        new Order { OrderId = 3, CustomerId = 200, OrderDate = new DateTime(2023, 1, 4), Amount = 300 },
        new Order { OrderId = 4, CustomerId = 100, OrderDate = new DateTime(2023, 1, 6), Amount = 250 },
        new Order { OrderId = 5, CustomerId = 200, OrderDate = new DateTime(2023, 1, 2), Amount = 100 }
    };

    // 实现 ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY OrderDate)
    var result = orders
        .GroupBy(o => o.CustomerId) // 对应 PARTITION BY CustomerId
        .SelectMany(group =>  // 展开分组,返回扁平结构(类似SQL的每行结果)
            group.OrderBy(o => o.OrderDate) // 对应 ORDER BY OrderDate(组内排序)
                 .Select((order, index) => new  // 生成组内序号(index从0开始,+1即为1-based)
                 {
                     order.OrderId,
                     order.CustomerId,
                     order.OrderDate,
                     order.Amount,
                     RowNumber = index + 1 // 对应 ROW_NUMBER()
                 })
        )
        .OrderBy(r => r.CustomerId) // 最终结果按客户ID排序(可选)
        .ThenBy(r => r.RowNumber);
    richTextBox1.Text = JsonConvert.SerializeObject(result, Formatting.Indented);
}
[
  {
    "OrderId": 2,
    "CustomerId": 100,
    "OrderDate": "2023-01-03T00:00:00",
    "Amount": 150.0,
    "RowNumber": 1
  },
  {
    "OrderId": 1,
    "CustomerId": 100,
    "OrderDate": "2023-01-05T00:00:00",
    "Amount": 200.0,
    "RowNumber": 2
  },
  {
    "OrderId": 4,
    "CustomerId": 100,
    "OrderDate": "2023-01-06T00:00:00",
    "Amount": 250.0,
    "RowNumber": 3
  },
  {
    "OrderId": 5,
    "CustomerId": 200,
    "OrderDate": "2023-01-02T00:00:00",
    "Amount": 100.0,
    "RowNumber": 1
  },
  {
    "OrderId": 3,
    "CustomerId": 200,
    "OrderDate": "2023-01-04T00:00:00",
    "Amount": 300.0,
    "RowNumber": 2
  }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值