Quel est le moyen le plus rapide de sortinger une requête EF-to-Linq?

En utilisant Entity Framework, en théorie qui est plus rapide:

// (1) sort then select/project // in db, for entire table var results = someQuery .OrderBy(q => q.FieldA) .Select(q => new { q.FieldA, q.FieldB }) .ToDictionary(q => q.FieldA, q => q.FieldB); 

ou

 // (2) select/project then sort // in db, on a smaller data set var results = someQuery .Select(q => new { q.FieldA, q.FieldB }) .OrderBy(q => q.FieldA) .ToDictionary(q => q.FieldA, q => q.FieldB); 

ou

 // (3) select/project then materialize then sort // in object space var results = someQuery .Select(q => new { q.FieldA, q.FieldB }) .ToDictionary(q => q.FieldA, q => q.FieldB) .OrderBy(q => q.FieldA); // -> this won't comstack, but you get the question 

Je ne suis pas un expert SQL, mais il semble intuitivement que 2 est plus rapide que 1 … est-ce correct? Et comment cela se compare-t-il à 3, car dans mon expérience avec EF, presque tout est plus rapide lorsqu'il est fait sur le db.

PS Je n'ai aucun outil de perf dans mon environnement, et je ne sais pas comment le tester, d'où la question.

Votre requête comstack et est en cours d'exécution au moment où vous appelez ToDictionary , donc 1 et 2 doivent être identiques et produire la même requête: vous obtenez une SELECT FieldA, FieldB FROM table ORDER BY FieldA dans les deux cas.

La troisième est différente: vous exécutez d'abord la requête SQL (sans la clause ORDER BY ), puis vous sortingez l'set en memory returnné (datatables ne sont pas sortingées par le fournisseur de la database, mais par le client). Cela peut être plus rapide ou plus lent selon la quantité de données, le matériel du server et du client, et comment votre database est conçue (index, etc.), l'infrastructure réseau, etc.

Il n'y a aucun moyen de dire lequel sera le plus rapide avec les informations que vous avez fournies

PS: cela n'a pas de sens car un Dictionary ne se soucie pas vraiment de l'ordre (je ne pense pas que 3 comstackrait puisque Dictionary<> , si je ne me trompe pas, n'a pas OrderBy ), mais changer ToDictionary ToList et il y a votre réponse de performance