Row_number over (Partition by-xxx) in Linq?

Ich habe eine DataTable der Struktur und Daten:

id | inst | name 
------------------------ 
1 | Gitarre | john 
2 | guitar | george 
3 | Gitarre | paul 
4 | drums | ringo 
5 | drums | pete 

Kann ich abrufen der Datensätze wie diese:

IEnumerable <Beatle>...

class Beatle
{
  int id;
  string inst;
  string name;
}

Ich mag würde, um die innere Ordnung von denen, die spielen die verschiedenen Instrumente. In MSSQL würde ich verwenden

SELECT 
    *
    ,Row_Number() OVER (PARTITION BY inst ORDER BY id) AS rn
FROM Beatles

Diese Abfrage gibt

id | inst | name | rn 
----------------------------- 
1 | Gitarre | Johannes | 1 
2 | guitar | george | 2 
3 | Gitarre | paul | 3 
4 | drums | ringo | 1 
5 | drums | pete | 2 

Wie kann ich das machen, dass in Linq ?

Bearbeiten.(nach der akzeptierten Antworten)

Voll funktionsfähig-code :

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);
}
Linq2SQL oder EF? Nicht sicher, ob es einen Unterschied macht oder so 🙂
linq2objects.
Das sollte nicht zu schwer da die Select-überladung mit dem index-parameter auf, wenn ich das richtig verstehe.

InformationsquelleAutor Royi Namir | 2012-04-02

Schreibe einen Kommentar