Mysql
 sql >> Database >  >> RDS >> Mysql

Possiamo controllare l'ordine delle espressioni LINQ con Skip(), Take() e OrderBy()

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.