Question

Je l'ai remarqué que certaines commande la cause LinqToSql de se connecter à la base de données et télécharger les documents qui font partie de la requête, par exemple, .ToArray ().

Est-ce que la commande .Cast () provoque une requête à exécuter (et comment puis-je dire ces choses à l'avenir?). Par exemple ...

IRevision<T> current = context.GetTable(typeof(T))
    .Cast<IRevision<T>>()
    .SingleOrDefault(o => o.ID == recordId);

Je sais qu'il ya une commande pour .GetTable qui vous permet de spécifier un type générique, mais pour des raisons étranges et inexplicables, il ne peut pas être utilisé dans cette situation.

Était-ce utile?

La solution

De Enumerable.Cast () remarques de :

  

Ce procédé est mis en oeuvre en utilisant l'exécution différée. La valeur de retour immédiat est un objet qui stocke toutes les informations nécessaires pour effectuer l'action. La requête représentée par cette méthode n'est pas exécutée jusqu'à ce que l'objet est soit en appelant énumérait sa méthode GetEnumerator directement ou en utilisant foreach dans Visual C # ou pour chaque dans Visual Basic.

Tous les opérateurs LINQ vous permettra de savoir si elles sont reportées ou de l'exécution de la requête immédiate. En outre, voici les opérateurs standard LINQ qui ne sont pas reportées:

  • Aggregate
  • Toutes
  • Tous
  • Moyenne
  • Contient
  • Count
  • ElementAt
  • ElementAtOrDefault
  • Première
  • FirstOrDefault
  • Dernière
  • LastOrDefault
  • LongCount
  • Max
  • Min
  • SequenceEqual
  • simple
  • SingleOrDefault
  • Somme
  • ToArray
  • ToDictionary
  • ToList
  • ToLookup

Autres conseils

Non, il ne fonctionne pas. Il suffit de faire un casting lorsque vous itérer IEnumerable.

Il n'y a pas de façon définitive (en code) pour savoir si oui ou non une méthode utilisera l'exécution différée ou non. La documentation va être votre meilleur ami ici comme il vous dira si elle diffère l'exécution ou non.

Cependant, cela ne signifie pas que vous ne pouvez pas faire des hypothèses si la documentation ne sait pas.

Si vous avez une méthode qui retourne une autre liste / structure (comme ToList, ToArray), il devra exécuter la requête afin d'alimenter la nouvelle structure de données.

Si la méthode retourne une valeur scalaire, alors il devra exécuter la requête pour générer cette valeur scalaire.

Autre que cela, si elle retourne simplement IEnumerable<T>, il reporte l'exécution plus-que-probable. Cependant, cela ne signifie pas qu'il est garanti, cela signifie simplement qu'il est plus-que-probable.

Ce que vous cherchez est appelée « exécution différée ». Des déclarations qui reportent l'exécution ne fonctionnent que lorsque vous tentez d'accéder aux données. Des déclarations telles que ToList exécutent immédiatement, car les données sont nécessaires pour la transformer en une liste.

Cast peut attendre jusqu'à ce que vous accéder réellement, il est donc une déclaration différée.

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