sql >> Base de Datos >  >> RDS >> Mysql

¿Podemos controlar el orden de las expresiones LINQ con Skip(), Take() y OrderBy()?

Mi solución temporal

He logrado solucionar este problema. No me malinterpreten aquí. Todavía no he resuelto el problema de precedencia, pero lo he mitigado.

¿Qué hice?

Este es el código que he usado hasta que recibo una respuesta de Devart . Si no pueden superar este problema, tendré que usar este código al 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();
}

En primer lugar, obtengo ID ordenados de mis entidades. Obtener solo ID tiene un buen rendimiento incluso con un conjunto de datos más grande. La consulta MySql es bastante simple y funciona muy bien. En la segunda parte, divido estos ID y los uso para obtener instancias de entidades reales.

Pensándolo bien, esto debería funcionar incluso mejor que la forma en que lo estaba haciendo al principio (como se describe en mi pregunta), porque obtener el recuento total es mucho más rápido debido a la consulta simplificada. La segunda parte es prácticamente muy similar, excepto que mis entidades se devuelven más bien por sus ID en lugar de particionarlas usando Skip y Take ...

Con suerte, alguien puede encontrar útil esta solución.