Saya bekerja di Entity Framework Core 1.1.0 (dan pemutakhiran bukanlah suatu pilihan saat ini, karena perubahan yang dapat menyebabkan gangguan pada versi yang lebih baru). Permintaan saya adalah dalam bentuk berikut:
var q = db.MyTable
.GroupBy(t => new { t.Field1 })
.Select(g => new
{
g.Key.Field1,
MaxField2 = g.Max(x => x.Field2)
})
.ToList();
Dalam kode pengujian ini berfungsi dengan baik dan mengembalikan data yang diharapkan. Namun ketika diterapkan ke lingkungan nyata, dengan data nyata, waktu habisnya. Mengapa? Baiklah, saya memasang sniffer di server SQL, dan inilah SQL sebenarnya:
SELECT [t].[Field1], [t].[Field2], [t].[Field3], [t].[Field4], [t].[Field5]
FROM [dbo].[MyTable] AS [t]
ORDER BY [t].[Field1]
Oh. Itu akan menjelaskannya. EF hanya mengkompilasi kueri hingga .GroupBy()
ke dalam SQL, sehingga mencoba memuat keseluruhan konten tabel (sekitar 17 juta catatan saat penulisan ini) ke dalam memori, dan pengelompokan lainnya dan pemesanan seharusnya dilakukan dalam memori.
Adakah saran bagaimana cara mengerjakan ulang kueri ini sehingga pekerjaan berat selesai di SQL?
Expression<Func<>>
dan kerjakan dengannya. Saya rasa tidak ada orang yang ingin membangun kembali struktur DB Anda dari awal, bekerja dengan EF Core versi lama dan men-debug ini sepenuhnya untuk Anda. - person Matthias Burger   schedule 19.07.2017Sum
:) - person Ivan Stoev   schedule 19.07.2017