Saya perlu menerjemahkan SQL
pernyataan ini menjadi Linq-Entity
kueri ...
SELECT name, count(name) FROM people
GROUP by name
Saya perlu menerjemahkan SQL
pernyataan ini menjadi Linq-Entity
kueri ...
SELECT name, count(name) FROM people
GROUP by name
Jawaban:
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 BY
dalam 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
Ekstensi yang berguna adalah mengumpulkan hasil Dictionary
untuk 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
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]
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() });