Let's say I want to rank my customer database by country. In SQL I would write:
select CountryID, CustomerCount = count(*),
[Rank] = RANK() over (order by count(*) desc)
from Customer
Now I want to write this in Entity Framework:
var ranks = db.Customers
.GroupBy(c => c.CountryID)
.OrderByDescending(g => g.Count())
.Select((g, index) => new {CountryID = g.Key, CustomerCount = g.Count, Rank = index+1});
There are two problems with this:
- It doesn't work. EF throws a
System.NotSupportedException
; evidently there's no SQL translation for the overload of .Select()
that uses the row number; you would have to pull everything into memory with a .ToList()
in order to be able to call this method; and
- Even if you run the method in local memory, it doesn't handle equal rankings the way the
RANK()
function does in SQL, i.e. they should have an equal rank, and then the following item skips to the original order.
So how should I do this?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…