Question

En fait, c'est la même question que ce message:

Comment puis-je assurer que mes requêtes LINQ exécuter lorsqu'il est appelé dans mon DAL, pas de façon retardée?

Mais comme il n'a pas expliqué pourquoi il le voulait, la question semble avoir été passé sur un peu. Voici mon problème similaire, mais mieux-expliqué:

I ai une poignée de fils de deux types (en ignorant des fils d'interface utilisateur pour un moment). Il y a un type de fil « données de collecte », et un type de fil « de calcul ». Les fils de collecte de données sont lentes. Il y a un peu de données à passé au crible d'une variété d'endroits. Les fils de calcul sont relativement rapides. Le modèle de conception jusqu'à ce point est d'envoyer des fils de collecte de données hors de trouver des données, et quand ils sont le passage complet pour le calcul des données.

Quand je me codé dans la collecte de données Linq j'ai fini de levage une partie de cette lenteur retour dans mes fils de calcul . Il y a maintenant des éléments de données qui ne sont pas complètement se résoudre jusqu'à ce qu'ils soient utilisés au cours du calcul - et c'est un problème

.

Je voudrais forcer Linq terminer ses travaux à un moment donné (fin de l'instruction? Fin de méthode? « S'il vous plaît terminer, dammit » appel de méthode) pour que je sais que je ne suis pas le payer plus tard . Ajout de « .ToList () » à la fin du Linq est 1. incommodes et 2. sent comme quelque chose de boxe qui est sur le point d'être UNBOXED dans un autre thread momentanément de toute façon.

Était-ce utile?

La solution

Vous ne seriez pas quoi que ce soit la boxe -. Vous seriez mise en mémoire tampon les résultats

L'utilisation est fondamentalement ToList() chemin à parcourir si vous voulez réellement les données. À moins que vous êtes prêt à utiliser les données immédiatement, il faut que ce soit tamponné quelque part , n'a pas? Une liste est juste un moyen pratique de le faire.

L'alternative consiste à effectuer le traitement alors et là aussi - utiliser les données que vous produisez, avec impatience. Je ne suis pas tout à fait les différents fils côté de chose, donc ce n'est pas clair pour moi si cela vous aiderait, mais ce sont essentiellement les choix disponibles pour vous autant que je peux voir.

est en fait un peu explicite dans votre description:

  

Le modèle de conception jusqu'à ce point est   d'envoyer des fils de collecte de données hors de   trouver des données, et quand ils sont complets   passer le haut pour le calcul des données.

L'appel essentiellement ce que des changements <=> vous revenez de « une requête qui peut récupérer les données lorsqu'on lui a demandé à » « les données lui-même, en mémoire tampon dans une liste ».

Autres conseils

Pouvez-vous expliquer pourquoi plus .ToList n'est pas acceptable? Vous avez parlé de la boxe et unboxing, mais ceux-ci sont complètement sujets sans rapport.

Une partie de forcer une requête LINQ pour compléter la demande nécessite le stockage des résultats. Dans le cas contraire, afin de voir à nouveau les résultats, vous auriez à repprocess la requête. .ToList réalise efficacement en stockant les éléments dans un List<T>.

Il est possible de stocker les éléments dans pratiquement toute autre structure de données de style de collection avec différents compromis qui peut convenir mieux à vos besoins.

Il y a une propriété dans la LoadOptions classe qui pourrait DataContext vous aider à récupérer les données avec plus d'ardeur.

Sinon, vous pouvez utiliser quelques

intelligent de mise ToList().

Je sais que ce fil est vieux ... de toute façon, personne ne drôle mentionné .ToLast () encore. Je fais quelque chose où LINQ est pas beaucoup plus qu'un foreach glorifié conduite des effets secondaires où je ne veux pas vraiment à la résultat de la requête ... donc je ne pas allouer de la mémoire plus faux que nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top