IT-Consulting

IT-Consulting bedeutet für uns vor allem eins: Zu verstehen, wie Ihr Unternehmen tickt, um Sie mit verlässlichen Lösungen in Ihrer Wertschöpfung zu unterstützen. Erfahren Sie mehr..

IT-Consulting

Database Management & BI

RDBMS sind aus dem modernen IT-Betrieb nicht mehr wegzudenken. Wir entwickeln für Sie ein Konzept, das die technische Architektur, den ausfallsicheren Betrieb, als auch Compliance-konforme Backups abdeckt. Erfahren Sie mehr..

Business Intelligence

Citrix Virtualisierung

Ein Versprechen vorweg: Wir ändern mit Citrix-Produkten die Arbeit der IT-Abteilung radikal – zum Guten. Skalierbare Rechenleistung von der kleinen Arztpraxis bis zur Enterprise Corporation. Virtualisierung ist das Zauberwort. Erfahren Sie mehr..

Citrix Virtualisierung

Sicherheit Exchange & Active Directory

Ihre Active Directory ist historisch gewachsen oder wurde zeitweise nicht korrekt gepflegt? Sie wissen nicht, wer alles legitimierten Zugriff auf Ihr Netzwerk besitzt? Erfahren Sie mehr..

Sicherheit Exchange & Active Directory

Hosting

Besonders für kleine und mittelständische Unternehmen bieten Infrastructure-as-a-Service (IaaS)-Modelle kostengünstige Alternativen zur Anschaffung und Instandhaltung eigener Hardware. Erfahren Sie mehr..

Hosting

Softwareentwicklung

„Wir machen möglich, was Standardsoftware nicht kann.“ Business Web Applications - Individualentwicklungen sind unsere Stärken. Sie haben ein Anliegen, wir können Ihnen helfen. Erfahren Sie mehr..

Softwareentwicklung

Entity Framework – „Too high level of nesting for SELECT“


Bei der Erstellung von Abfragen mittels Entity Framework gibt es die zwei bekannten LINQ-Methoden Any() und Contains(). Gerne werden diese bei Abfragen, in denen geprüft wird, ob ein Element Teil einer Liste ist, als gleichwertig betrachtet:

private bool existsElement(IQueryable<Element> list, int id)
{
   return list.Any(e => e.Id == id);
}

private bool existsElement(IQueryable<Element> list, int id)
{
   return list.Contains(id);
}

Beide Methoden liefern das gleiche Ergebnis; der Unterschied (bezogen auf das Entity Framework) besteht in der Umsetzung zu einer SQL-Anweisung.

Problem

Wird die Any()-Variante gewählt, so kann es bei zu großen Listen zu einer Exception kommen („Too high level of nesting for SELECT“). Dieses Problem tritt bei einer Listengröße von etwa 30 Elementen auf.

Ursache

Die Ursache der Exception liegt in der Konvertierung der beiden LINQ-Methoden durch das Entity Framework. Während bei Any() für jedes Element eine verschachtelte Subquery mittels SELECT erzeugt wird, wird bei der Contains()-Methode lediglich ein einzelnes Where-Constraint erzeugt:

Beispiel (Auszüge aus den generierten SQL-Statements)

Any()


FROM ((SELECT `UnionAll5`.`C1` FROM ((SELECT `UnionAll4`.`C1` FROM ((SELECT `UnionAll3`.`C1` FROM
((SELECT `UnionAll2`.`C1` FROM ((SELECT `UnionAll1`.`C1` FROM ((SELECT 4 AS `C1` FROM
(SELECT 1 AS `X`) AS `SingleRowTable1`) UNION ALL (SELECT 5 AS `C1` FROM (SELECT 1 AS `X`) AS
`SingleRowTable2`)) AS `UnionAll1`) UNION ALL (SELECT 6 AS `C1` FROM (SELECT 1 AS `X`) AS
`SingleRowTable3`)) AS `UnionAll2`) UNION ALL (SELECT 7 AS `C1` FROM (SELECT 1 AS `X`) AS
`SingleRowTable4`)) AS `UnionAll3`) UNION ALL (SELECT 8 AS `C1`

Contains()

… WHERE (`Extent1`.`Id` IN ( 4,5,6,7,8,9,10,12,13,14,15,17,18,19,22,23,24,26,27,28,29,…) …


Schreibe einen Kommentar