SQL ke Entity Framework Count Group-By

Jawaban:

181

Sintaks kueri

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

Sintaks metode

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

Sunting: EF Core 2.1 akhirnya mendukung GroupBy

Tapi selalu perhatikan di konsol / log untuk pesan. Jika Anda melihat pemberitahuan bahwa kueri Anda tidak dapat dikonversi ke SQL dan akan dievaluasi secara lokal, Anda mungkin perlu menulis ulang.


Entity Framework 7 (sekarang berganti nama menjadi Entity Framework Core 1.0 / 2.0 ) belum mendukung GroupBy()terjemahan ke GROUP BYdalam SQL yang dihasilkan (bahkan di rilis 1.0 final itu tidak akan). Setiap logika pengelompokan akan berjalan di sisi klien, yang dapat menyebabkan banyak data dimuat.

Akhirnya kode yang ditulis seperti ini akan secara otomatis mulai menggunakan GROUP BY, tetapi untuk saat ini Anda harus sangat berhati-hati jika memuat seluruh kumpulan data yang tidak dikelompokkan ke dalam memori akan menyebabkan masalah kinerja.

Untuk skenario di mana ini adalah pemecah kesepakatan, Anda harus menulis SQL dengan tangan dan menjalankannya melalui EF.

Jika ragu, jalankan Sql Profiler dan lihat apa yang dihasilkan - yang mungkin harus Anda lakukan.

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

Simon_Weaver
sumber
5
Terima kasih atas perhatiannya
Jacob Stamm
4
Juga tidak ada pengelompokan dalam 1.1
Simon_Weaver
4
atau 1.2 atau 2.0. Saya menyerah
Simon_Weaver
4
itu diumumkan untuk 2,1
Yush0
Ini bisa menyesatkan, saya pikir penting untuk memperbarui jawaban Anda dan menyebutkan secara eksplisit bahwa versi EF sebelum EF 7 mendukung pengelompokan. Jawaban yang lebih merupakan komentar daripada jawaban sebenarnya atas pertanyaan OP ini menyesatkan jika dibaca dengan sendirinya (dan diartikan sebagai jawaban OP yang bukan). Saat membaca ini, orang bisa mendapatkan kesan yang salah seolah-olah EF 7 tidak mendukung pengelompokan dan jelas versi sebelumnya tidak mendukungnya, itu tidak benar.
BornToCode
14

Ekstensi yang berguna adalah mengumpulkan hasil Dictionaryuntuk pencarian cepat (misalnya dalam satu lingkaran):

var resultDict = _dbContext.Projects
    .Where(p => p.Status == ProjectStatus.Active)
    .GroupBy(f => f.Country)
    .Select(g => new { country = g.Key, count = g.Count() })
    .ToDictionary(k => k.country, i => i.count);

Awalnya ditemukan di sini: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c

Christian Moser
sumber
1

Berikut adalah contoh sederhana dari group by in .net core 2.1

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

Yang diterjemahkan menjadi:

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

dengan EF 6.2 itu berhasil untuk saya

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