2010-07-29 3 views
4
var emps = from x in DB 
      where x.ID = 100 
      select x; 

var emp1 = from x1 in DB 
      where x1.ID = 100 
      select new { x }; 

Quelle est la différence entre ces deux requêtes.Requête de type anonyme ou requête normale dans LINQ

Si nous utilisons types anonymes est la performance sera augmentée ou toute autre différence aussi là-bas?

+0

@ Muralidharan-TNJ btw. Bonjour sur stackoverflow. C'est une bonne pratique ici de marquer comme réponse à un message qui résout votre problème. S'il vous plaît rappelez-vous à ce sujet;) –

Répondre

4

Il y a une grande diffrence dans ces deux requêtes. First renvoie la collection de votre entité, la seconde renvoie la collection de type anonyme qui a un membre appelé 'x' contenant votre entité.

Accès à emps:

emps.First().SomeMember 

Accès à emp1:

emp1.First().x.SomeMember 

La première est correcte et naturelle, la deuxième est étrange et à mon avis, pas vraiment ce que vous voulez ACHIVE.

En outre, il est pas vrai, que l'utilisation de type anonyme ici augmentera les performances. L'entité qui représente l'objet doit être construite de toute façon, mais cette fois vous l'obtenez sous une forme moins amicale.

3

La plupart des considérations de performance sont susceptibles d'être en termes de SQL généré - et cela ne devrait pas changer ici. (Vous pouvez vérifier, bien sûr, mais je serais étonné si cela faisait une différence.)

Cela prend un peu plus d'effort pour créer une instance d'un type anonyme que de ne pas, bien sûr. Je ne vois aucune raison pour laquelle l'utilisation d'un type anonyme serait ici faire exécuter mieux - Je pense à effectuer très légèrement pire, mais pas vraiment sensiblement donc. Plus important encore, je ne peux pas voir comment ce dernier ajoute autre chose qu'une couche additionnelle inutile d'indirection. Cela rendra votre code marginalement moins clair, sans bénéfice. Les types anonymes sont parfaits lorsque vous souhaitez regrouper des valeurs séparées - ou interroger uniquement un sous-ensemble de colonnes dans une table - mais les types anonymes à une seule propriété sont rarement utiles.

+0

Je pense qu'il a juste donné un exemple simple, dépouillé de la plus grande partie de la complexité. Je peux voir un cas d'utilisation où les résultats anonymes seraient utiles, surtout quand vous voulez retourner une collection de n-tuples. il supprime le travail fastidieux de déclarer "sélectionner un nouveau Tuple (myThing, myThing, myThing, myThing, myThing, myThing)" ... –

+0

Bien sûr .. les types anonymes n'étaient pas inventé pour rien et il y a une variété d'usages possibles qui sont bons. Encore je pense, qu'il voulait dire si l'exemple présenté rend une performance différente. –

+0

@ Aurélien: Et c'est pourquoi j'ai explicitement dit où les types anonymes sont utiles. Mais ils ne sont * pas * utiles dans le seul exemple présenté, et ils ne donnent pas non plus d'avantage de performance. –