Solusi solusi saya
Saya telah berhasil mengatasi masalah ini. Jangan salah paham di sini. Saya belum memecahkan masalah prioritas, tetapi saya telah menguranginya.
Apa yang saya lakukan?
Ini adalah kode yang saya gunakan sampai saya mendapat jawaban dari Devart . Jika mereka tidak dapat mengatasi masalah ini, saya harus menggunakan kode ini pada akhirnya.
// get ordered list of IDs
List<int> ids = ctx.MyEntitySet
.Include(/* Related entity set that is needed in where clause */)
.Where(/* filter */)
.OrderByDescending(e => e.ChangedDate)
.Select(e => e.Id)
.ToList();
// get total count
int total = ids.Count;
if (total > 0)
{
// get a single page of results
List<MyEntity> result = ctx.MyEntitySet
.Include(/* related entity set (as described above) */)
.Include(/* additional entity set that's neede in end results */)
.Where(string.Format("it.Id in {{{0}}}", string.Join(",", ids.ConvertAll(id => id.ToString()).Skip(pageSize * currentPageIndex).Take(pageSize).ToArray())))
.OrderByDescending(e => e.ChangedOn)
.ToList();
}
Pertama-tama saya mendapatkan ID yang dipesan dari entitas saya. Hanya mendapatkan ID adalah kinerja yang baik bahkan dengan kumpulan data yang lebih besar. Permintaan MySql cukup sederhana dan berkinerja sangat baik. Di bagian kedua saya mempartisi ID ini dan menggunakannya untuk mendapatkan instance entitas yang sebenarnya.
Memikirkannya, ini seharusnya berkinerja lebih baik daripada cara saya melakukannya di awal (seperti yang dijelaskan dalam pertanyaan saya), karena mendapatkan jumlah total jauh lebih cepat karena kueri yang disederhanakan. Bagian kedua praktis sangat mirip, kecuali bahwa entitas saya dikembalikan oleh ID mereka alih-alih dipartisi menggunakan Skip
dan Take
...
Semoga seseorang dapat menemukan solusi ini bermanfaat.