2014-12-14 20 views
5

Müşteri veritabanımı ülkeye göre sıralamak istiyorum. SQL ben yazardım:Varlık Çerçevesinde SQL'de RANK() işlevine çeviren bir işlev var mı?

select CountryID, CustomerCount = count(*), 
     [Rank] = RANK() over (order by count(*) desc) 
from Customer 

Şimdi Entity Framework bunu yazmak istiyorum: O çalışmıyor

  1. :

    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}); 
    

    bu iki sorun vardır. EF bir System.NotSupportedException; Açıkçası, satır numarasını kullanan overload of .Select() için SQL çevirisi yoktur; Bu yöntemi çağırmak için her şeyi .ToList() ile belleğe çekmek zorunda kalacaksınız; ve yöntemi yerel bellekte çalıştırsanız bile, RANK() işlevinin SQL'de yaptığı gibi eşit sıralamayı işlemez, yani eşit bir sıraya sahip olmalı ve ardından aşağıdaki öğe orijinal sırasına atlar.

Peki bunu nasıl yapmalıyım?

+2

AKAIK Rank() LINQ içinde yerleşik bir işlevi yoktur. Bu cevap yaklaşımınızı kullanır, ancak onlar için işe yaramaktadır: http://stackoverflow.com/a/21035060/7720 veya bu sorunun birkaç seçeneği vardır. – Romias

+0

@Romias, sorunumu çözen [bu yanıtı] (http://stackoverflow.com/a/10705535/7850) bulmak için beni yola koydu. Buraya bir cevap olarak yazmaktan çekinmeyin, böylece size kredi verebilirim! –

+0

Sevindim sana yardımcı ol ... Yorumu cevabını koyuyorum! Teşekkürler! – Romias

cevap

3

AFAIK Rank(), LINQ'de yerleşik bir işlevi yoktur. This answer yaklaşımınızı kullanır, ancak onlar için çalışıyor gibi görünüyor. Bunu nasıl kullanabilirsiniz:

var customersByCountry = db.Customers 
    .GroupBy(c => c.CountryID); 
    .Select(g => new { CountryID = g.Key, Count = g.Count() }); 
var ranks = customersByCountry 
    .Select(c => new 
     { 
      c.CountryID, 
      c.Count, 
      Rank = customersByCountry.Count(c2 => c2.Count > c.Count) + 1 
     }); 
+0

Teşekkürler! Uyguladığını görebilmek için bir kod ekledim. –

İlgili konular