我有一个DataTable具有以下结构和数据的:
DataTable
id | 仪器 名称 ------------------------ 1 | 吉他| 约翰 2 | 吉他| 乔治 3 | 吉他| 保罗 4 | 鼓| 林戈 5 | 鼓| 皮特
我可以这样检索记录:
IEnumerable <Beatle>... class Beatle { int id; string inst; string name; }
我想获得演奏不同乐器的人的内部秩序。在MSSQL中,我会使用
SELECT * ,Row_Number() OVER (PARTITION BY inst ORDER BY id) AS rn FROM Beatles
该查询返回
id | 仪器 名称| rn ----------------------------- 1 | 吉他| 约翰| 1个 2 | 吉他| 乔治| 2 3 | 吉他| 保罗| 3 4 | 鼓| 铃声 1个 5 | 鼓| 皮特| 2
我如何在 Linq中 做到这一点?
编辑(接受答案后)
完整的工作代码:
var beatles = (new[] { new { id=1 , inst = "guitar" , name="john" }, new { id=2 , inst = "guitar" , name="george" }, new { id=3 , inst = "guitar" , name="paul" }, new { id=4 , inst = "drums" , name="ringo" }, new { id=5 , inst = "drums" , name="pete" } }); var o = beatles.OrderBy(x => x.id).GroupBy(x => x.inst) .Select(g => new { g, count = g.Count() }) .SelectMany(t => t.g.Select(b => b) .Zip(Enumerable.Range(1, t.count), (j, i) => new { j.inst, j.name, rn = i })); foreach (var i in o) { Console.WriteLine("{0} {1} {2}", i.inst, i.name, i.rn); }
B“高
我知道这很旧。但是为什么解决方案不简单?
var o = beatles.GroupBy(x => x.inst) .SelectMany(g => g.Select((j, i) => new { j.inst, j.name, rn = i + 1 }) );