2010-12-09 35 views
0

J'apprécierais beaucoup une explication détaillée de (et si) il y a une différence dans ce qui se passe dans les coulisses de l'extrait de code Linq to Entities suivant ces scénarios:
A. Le "foreach" "loop était dans la clause" using "
B. Au lieu de Linq to Entites, j'utilisais un mappage silimilaire exécutant la requête sur Linq à Sql.
C. A + B.
Linq dans les coulisses

le code:

ILookup<string, tblProduct> productBooks; 
     using (TbsDBEntities tbsDbEntities = new TbsDBEntities()) 
     { 
      productBooks = (from tbsDbEntity in tbsDbEntities.tblProducts 
          orderby tbsDbEntity.Title 
          select tbsDbEntity).ToLookup(p => p.Title.Substring(0, 1).ToUpper()); 

     } 


     foreach (IGrouping<string, tblProduct> productBook in productBooks) 
     { 
      if (productBook.Key[0] >= 'A' && productBook.Key[0] <= 'Z') 
      { 
       HtmlAnchor anchor = new HtmlAnchor(); 
       anchor.InnerText = productBook.Key+" "; 
       anchor.HRef ="/"+ productBook.Key; 
       divHeader.Controls.Add(anchor); 
      } 

Répondre

0

Dans les coulisses: Le code accède à la liste de base de données produits par la mise en correspondance des entités .. en général on aurait écrit ce code pour ADO.NET Entity Framework + Linq aux entités. Le code utilise linq pour extraire des lignes de données au lieu d'utiliser des requêtes sql typiques comme "select * from products" .. le mappage des entités devrait générer une requête en coulisse et obtenir des données .. si vous avez sql profiler Comme outil, vous serez en mesure de voir la requête que le code passe au serveur SQL. Le foreach crée généralement des liens, pour chaque produit renvoyé à partir des instructions linq ... et il ajoute les liens dans un .. Une instruction if protège probablement le code des noms de produits qui ne commencent pas par un caractère alphabétique. . et donc probablement le chèque> = a et Z = <


A. ne devrait pas avoir une différence.

B. Vous pourriez avoir un gain de performance de considération si tblProducts a beaucoup de données .. parce que LINQ à la base de données permettrait d'éviter la construction d'objets entité pour toutes les données.

C. Comme B ... parce que je crois avoir la boucle for intérieur « à l'aide » ne le rend pas différent

+0

Pouvez-vous élaborer sur B s'il vous plaît? – dortzur

+0

Linq-to-Entities crée un modèle d'entité pour la base de données avant d'interroger la base de données et possède une classe DataLayer avec des entités en arrière-plan .. Les entités de données chargent le résultat de la base de données vers les entités objet. les entités d'objet pour générer l'objet IEnumerable (Element) .. le résultat d'une requête linq. Linq-to-SQL interroge directement la base de données et charge un objet IEnumerable (Element) pour le résultat ... ce qui supprime le surcoût de la création d'entités. –

0

Je regardais attentivement et pensé « qui ne fonctionnera pas » après la using est fermé.

Cependant, le ToLookup() exécute effectivement l'instruction SQL, donc tout va bien. En le laissant comme IEnumerable le fera échouer dans votre deuxième foreach car le contexte aura été éliminé. Linq to SQL ira bien avec ce code.