Minha solução alternativa
Eu consegui contornar esse problema. Não me interpretem mal aqui. Ainda não resolvi o problema de precedência, mas o atenuei.
O que eu fiz?
Este é o código que usei até obter uma resposta de Devart . Se eles não conseguirem superar esse problema, terei que usar esse código no final.
// 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();
}
Em primeiro lugar, estou recebendo IDs ordenados de minhas entidades. Obter apenas IDs tem um bom desempenho, mesmo com um conjunto maior de dados. A consulta MySql é bastante simples e funciona muito bem. Na segunda parte, particiono esses IDs e os uso para obter instâncias de entidade reais.
Pensando nisso, isso deve ter um desempenho ainda melhor do que a maneira como eu estava fazendo no início (conforme descrito na minha pergunta), porque obter a contagem total é muito mais rápido devido à consulta simplificada. A segunda parte é praticamente muito semelhante, exceto que minhas entidades são retornadas por seus IDs em vez de particionadas usando
Skip
e Take
... Espero que alguém possa achar esta solução útil.