我有一个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 rnFROM 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);}
3 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
B“高
我知道这很旧。但是为什么解决方案不简单?
var o = beatles.GroupBy(x => x.inst)
.SelectMany(g =>
g.Select((j, i) => new { j.inst, j.name, rn = i + 1 })
);
慕哥9229398
TA贡献1877条经验 获得超6个赞
正如@The_Smallest所指出的,LINQ不支持行号。不过,您可以通过以下方式找到想要的东西:
var grouped = beatles.OrderBy( x => x.id )
.ToList() // required because SelectMany below doesn't evaluate to SQL
.GroupBy( x => x.inst );
var rns = grouped.ToDictionary( x => x.Key, x => 1 );
var result = grouped
.SelectMany( x => x.Select(
y => new { inst = y.inst, name = y.name, rn = rns[y.inst]++ } ) );
- 3 回答
- 0 关注
- 478 浏览
添加回答
举报
0/150
提交
取消