2010-12-07 7 views
2

Je possède ce requête LINQ to SQL:Comment optimiser cette requête linq?

var items = 
    from i in context.Items 
    orderby i.itemId descending 
    select new ItemWithCategories 
    { 
     item = i, 
     categories = (
      from cats in context.categories 
      join ic in context.itemCategories 
       on cats.categoryId equals ic.categoryId 
      where ic.itemId == i.itemId 
      select cats).ToList() 
    }; 

Il est trois tables. J'ai besoin de joindre les catégories avec les éléments mais il y a une table entre (plusieurs-à-plusieurs). Est-il préférable de faire cette requête?

+1

Avez-vous examiné le SQL généré et leurs plans de requête? –

Répondre

1

Cela donne les mêmes résultats, mais il est beaucoup plus facile à lire:

var items = 
    from item in context.Items 
    orderby item.itemId descending 
    select new ItemWithCategories 
    { 
     item = item, 
     categories = (
      from itemCategory in item.itemCategories 
      select itemCategory.category).ToList() 
    }; 

Voyez comment je l'ai enlevé la jointure déclaration, mais en utilisant la propriété itemCategories de item?

0

La requête que vous avez va créer une liste d'objets qui auront des références à des requêtes (les catégories) qui seront ensuite exécutées lors de leur accès (si elles ne sont pas du tout). Cela peut causer beaucoup de "bavardage" entre le client et le serveur de base de données, ainsi que le surcoût supplémentaire de l'envoi de données d'en-tête à plusieurs reprises à travers votre flux TDS.

Vous pouvez envisager d'effectuer une jointure et d'aplatir les données ici. Cela ne nécessiterait qu'une seule recherche, au prix de la réplication des données du côté gauche (éléments).

Bien sûr, avec toute optimisation, la clé est de tester, tester, tester.

Questions connexes