SQL'den Entity Framework'e Sayım Grubu


Yanıtlar:


190

Sorgu sözdizimi

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

Yöntem sözdizimi

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

Düzenleme: EF Core 2.1 sonunda GroupBy'yi destekliyor

Ancak her zaman konsol / günlükte mesajlara dikkat edin. Sorgunuzun SQL'e dönüştürülemediğine ve yerel olarak değerlendirileceğine dair bir bildirim görürseniz, yeniden yazmanız gerekebilir.


Entity Framework 7 (artık Entity Framework Core 1.0 / 2.0 olarak yeniden adlandırılmıştır ) henüz oluşturulan SQL'de GroupBy()çeviri için destek sağlamamaktadır GROUP BY(son 1.0 sürümünde bile desteklemeyecektir). Herhangi bir gruplama mantığı istemci tarafında çalışacak ve bu da çok fazla verinin yüklenmesine neden olabilir.

Sonunda bu şekilde yazılan kod otomatik olarak GROUP BY kullanmaya başlayacaktır, ancak şimdilik tüm gruplanmamış veri kümenizi belleğe yüklemek performans sorunlarına neden olacaksa çok dikkatli olmanız gerekir.

Bunun bir anlaşma bozucu olduğu senaryolar için SQL'i elle yazmanız ve EF aracılığıyla yürütmeniz gerekir.

Şüpheniz varsa, Sql Profiler'ı çalıştırın ve neyin üretildiğini görün - muhtemelen yine de yapıyor olmalısınız.

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2


6
Uyarılar için teşekkürler
Jacob Stamm

4
Ayrıca 1.1'de gruplama yok
Simon_Weaver

5
veya 1.2 veya 2.0. Pes
Simon_Weaver

4
2.1
Yush0

Bu yanıltıcı olabilir, cevabınızı güncellemenin ve EF 7'den önceki EF sürümlerinin gruplamayı desteklediğini açıkça belirtmenin önemli olduğunu düşünüyorum. OP sorusuna verilen gerçek bir cevaptan çok bir yorum olan bu cevap, kendi başına okunduğunda yanıltıcıdır (ve olmayan OP'ye cevap olarak yorumlanır). Bunu okurken, sanki EF 7 bile gruplamayı desteklemiyor ve açıkçası önceki sürümler bunu desteklemiyormuş gibi yanlış izlenime kapılabilir, bu da doğru değildir.
BornToCode


3

İşte .net çekirdek 2.1'deki basit bir grup örneği

var query = this.DbContext.Notifications.
            Where(n=> n.Sent == false).
            GroupBy(n => new { n.AppUserId })
            .Select(g => new { AppUserId = g.Key, Count =  g.Count() });

var query2 = from n in this.DbContext.Notifications
            where n.Sent == false
            group n by n.AppUserId into g
            select new { id = g.Key,  Count = g.Count()};

Hangisi şu anlama gelir:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

0

EF 6.2 ile benim için çalıştı

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.