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.
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