2010-12-07 27 views
2

Ich habe diese LINQ to SQL-Abfrage:Wie kann ich diese linq-Abfrage optimieren?

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() 
    }; 

Es ist drei Tabellen. Ich muss den Kategorien mit den Elementen beitreten, aber es gibt eine Tabelle dazwischen (viele-zu-viele). Gibt es eine bessere Abfrage?

+1

Haben Sie die generierten SQL und ihre Abfragepläne untersucht? –

Antwort

1

Dies die gleichen Ergebnisse liefert, ist aber viel einfacher zu lesen:

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() 
    }; 

Sehen Sie, wie ich die Aussage kommen entfernt, aber die itemCategories Eigenschaft item mit?

0

Die Abfrage, die Sie haben, wird eine Liste von Objekten erstellen, die Verweise auf Abfragen (die Kategorien) haben, die dann ausgeführt werden, wenn auf sie zugegriffen wird (wenn sie überhaupt vorhanden sind).

Dies kann eine Menge "Geplapper" zwischen dem Client und dem Datenbankserver verursachen, sowie den zusätzlichen Aufwand, Header-Daten wiederholt über Ihren TDS-Stream zu senden.

Sie könnten hier einen Join und eine Verflachung der Daten in Betracht ziehen. Es würde nur eine Suche erfordern, auf Kosten der Replikation der Daten auf der linken Seite (Elemente).

Natürlich, mit jeder Optimierung ist der Schlüssel zu testen, zu testen, zu testen.