2009-04-28 3 views
0

Der folgende (gekürzte) Codeauszug ist eine Linq-To-Entities-Abfrage, die zu SQL (via ToTraceString) führt, das viel langsamer als eine handgefertigte Abfrage ist. Mache ich etwas Dummes, oder ist Linq-to-Entities nur schlecht in der Optimierung von Abfragen?Warum ist das von LINQ-to-Entities erzeugte SQL so ineffizient?

Ich habe eine ToList() am Ende der Abfrage, wie ich es vor der Verwendung ausführen muss, um eine XML-Datenstruktur aufzubauen (was ein ganz anderer Schmerz war).

var result = (from mainEntity in entities.Main 
       where (mainEntity.Date >= today) && (mainEntity.Date <= tomorrow) && (!mainEntity.IsEnabled) 
       select new 
       { 
        Id = mainEntity.Id, 
        Sub = 
         from subEntity in mainEntity.Sub 
         select 
         { 
          Id = subEntity.Id, 
          FirstResults = 
           from firstResultEntity in subEntity.FirstResult 
           select new 
           { 
            Value = firstResultEntity.Value, 
           }, 
          SecondResults = 
           from secondResultEntity in subEntity.SecondResult 
           select 
           { 
            Value = secondResultEntity.Value, 
           }, 
          SubSub = 
           from subSubEntity in entities.SubSub 
           where (subEntity.Id == subSubEntity.MainId) && (subEntity.Id == subSubEntity.SubId) 
           select 
            new 
            { 
             Name = (from name in entities.Name 
               where subSubEntity.NameId == name.Id 
               select name.Name).FirstOrDefault() 
            } 
          } 
       }).ToList(); 

Während ich daran arbeite, habe ich auch einige echte Probleme mit Dates. Als ich gerade versucht habe, zurückgegebene Daten in meine Datenstruktur aufzunehmen, habe ich den internen Fehler "1005" erhalten.

Antwort

7

Nur als allgemeine Beobachtung und nicht auf praktischer Erfahrung mit Linq-To-Entities (noch): vier verschachtelte Unterabfragen innerhalb einer einzigen Abfrage zu haben, sieht nicht so aus, als wäre es sehr effizient und schnell zu beginnen.

Ich denke, Ihre sehr breite Aussage über die (mangelnde) Qualität des von Linq-to-Entities generierten SQL ist nicht gerechtfertigt - und Sie unterstützen es auch nicht wirklich durch viele Beweise.

Mehrere angesehen Leute einschließlich Rico Mariani (MS Performance-Guru) und Julie Lerman (Autor des Buchs "Programming EF") wurde in verschiedenen Tests, die im Allgemeinen und insgesamt die Linq to SQL und LINQ-to-Entities zeigt " Motoren "sind nicht wirklich so schlecht - sie erreichen insgesamt mindestens 80-95% der möglichen Spitzenleistung. Nicht jeder .NET-App-Entwickler kann dies erreichen :-)

Gibt es irgendeine Möglichkeit für Sie, diese Abfrage neu zu schreiben oder die Art und Weise zu ändern, wie Sie die Teile ihres Inhalts abrufen?

Marc

+0

Sind in LINQ-to-Entities (z. B. anstelle von Joins) keine verschachtelten Unterabfragen * empfohlen *? Siehe http://blogs.msdn.com/esql/archive/2007/11/01/EntitySQL_5F00_Tip_5F00_1.aspx – dommer

0

Haben Sie nicht versucht, das Ergebnis sofort durch den Aufruf .ToList materialisieren()? Ich bin mir nicht sicher, dass es einen Unterschied machen, aber Sie könnten eine verbesserte Leistung sehen, wenn Sie über das Ergebnis iterieren statt .ToList des Aufrufs() ...

foreach(var r in result) 
{ 
    // build your XML 
} 

Auch könnten Sie versuchen, die eine große Zerschlagung Abfrage in separate Abfragen und dann über die Ergebnisse iterieren. Alles in einem großen Schluck zu senden könnte das Problem sein.

Verwandte Themen