Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pouvons-nous contrôler l'ordre des expressions LINQ avec Skip (), Take () et OrderBy ()

Ma solution de contournement

J'ai réussi à contourner ce problème. Ne vous méprenez pas ici. Je n'ai pas encore résolu le problème de priorité, mais je l'ai atténué.

Qu'est-ce que j'ai fait ?

C'est le code que j'ai utilisé jusqu'à ce que j'obtienne une réponse de Devart . S'ils ne parviennent pas à résoudre ce problème, je devrai utiliser ce code à la fin.

// 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();
}

Tout d'abord, je reçois les ID commandés de mes entités. Obtenir uniquement des identifiants est bien performant même avec un ensemble de données plus important. La requête MySql est assez simple et fonctionne très bien. Dans la deuxième partie, je partitionne ces identifiants et les utilise pour obtenir des instances d'entité réelles.

En y pensant, cela devrait fonctionner encore mieux que la façon dont je le faisais au début (comme décrit dans ma question), car l'obtention du nombre total est beaucoup plus rapide en raison d'une requête simplifiée. La deuxième partie est pratiquement très très similaire, sauf que mes entités sont renvoyées plutôt par leurs identifiants au lieu d'être partitionnées à l'aide de Skip et Take ...

J'espère que quelqu'un pourra trouver cette solution utile.