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

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


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


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]

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() });
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.