Entity Framework 4 - Aus IN wird IN
So banal der Titel auch klingt, das Entity Framework in der ersten Version konnte den SQL-Operator IN nicht erzeugen. Interessanterweise gibt es den Mengenoperator IN im Entity SQL, aber zur Datenbank wurde ein OR - Konstrukt abgesetzt. Zum Glück ist der SQL-Server in der Lage solche hässlichen SQL-Abfragen zu optimieren.

- Abbildung 1: Ausführungsplan Gegenüberstellung OR-Konstrukt mit Mengenoperator IN
Wer jetzt denkt wo ist das Problem, der kennt den Oracle-Server nicht. Oracle verzeiht solche schrecklichen Abfragen in der Regel nicht. Um in Oracle Abfragen mit OR–Konstrukten zu optimieren, steht der Hint USE_CONCAT zur Verfügung. Diesen mit dem Entity Framework zu benutzen, erweist sich aber als schwierig. Hinzu kommt, dass Microsoft für andere Datenbanken keine Provider anbieten wird.
Wie gross der Text der erzeugten SQL-Abfrage sein kann, habe ich noch nicht gefunden, eine Testabfrage erzeugte in meiner Umgebung ca. 45‘000 Zeichen und die konnte problemlos zum SQL-Server gesendet und verarbeitet werden.
In diesem Beitrag will ich mich dem Mengenoperator IN im eSQL widmen, da auch die Meinung vertreten wird, dass IN nicht vom Entity Framework unterstützt würde. Die letzte Konferenz, auf der ich diese Aussage hörte, war die Basta Spring.
Der Ausführungsplan ist bereits in Abbildung 1 zu sehen, nachfolgend ist der eSQL-Ausdruck für den Mengenoperator IN und die SQL-Abfrage die in der .NET 3.5-Umgebung abgesetzt wird.
eSQL
SELECT VALUE p.diAutoID FROM TestModel35.Dispatchings AS p
WHERE p.diAutoID IN { 1,2,3,4,5,6,7,8 }
T-SQL (erzeugt von EF1) SELECT [Extent1].[diAutoID] AS [diAutoID] FROM [dbo].[tbDispatching] AS [Extent1] WHERE ([Extent1].[diAutoID] = 1) OR ([Extent1].[diAutoID] = 2) OR ([Extent1].[diAutoID] = 3) OR ([Extent1].[diAutoID] = 4) OR ([Extent1].[diAutoID] = 5) OR ([Extent1].[diAutoID] = 6) OR ([Extent1].[diAutoID] = 7) OR ([Extent1].[diAutoID] = 8)
Im Entity Framework 4 ändert sich an der eSQL-Syntax nichts. Der einzige Unterschied liegt im erzeugten SQL-Code.
T-SQL (erzeugt von EF4) SELECT [Extent1].[diPlanAutoID] AS [diPlanAutoID] FROM [dbo].[tbDispatching] AS [Extent1] WHERE [Extent1].[diAutoID] IN (1,2,3,4,5,6,7,8)
Dieses Beispiel zeigt schön, dass im Entity Framework 4 auch unter der Haube - am SQL-Code - gearbeitet wurde. In diesem Bereich wird vor allem der Administrator aufatmen können.
- 0 Kommentar(e)


Mein Kommentar