Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Podemos controlar a ordem da expressão LINQ com Skip(), Take() e OrderBy()

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.