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