La mia soluzione alternativa
Sono riuscito a risolvere questo problema. Non fraintendermi qui. Non ho ancora risolto il problema della precedenza, ma l'ho mitigato.
Cosa ho fatto?
Questo è il codice che ho usato fino a quando non ho ricevuto una risposta da Devart . Se non saranno in grado di superare questo problema, alla fine dovrò utilizzare questo codice.
// 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();
}
Prima di tutto ricevo gli ID ordinati delle mie entità. Ottenere solo ID è molto efficiente anche con una serie di dati più ampia. La query MySql è abbastanza semplice e funziona molto bene. Nella seconda parte partiziono questi ID e li uso per ottenere istanze di entità effettive.
A pensarci bene, questo dovrebbe funzionare anche meglio del modo in cui lo stavo facendo all'inizio (come descritto nella mia domanda), perché ottenere il conteggio totale è molto molto più veloce a causa della query semplificata. La seconda parte è praticamente molto molto simile, tranne per il fatto che le mie entità vengono restituite piuttosto dai loro ID invece che partizionate usando Skip
e Take
...
Si spera che qualcuno possa trovare utile questa soluzione.