Der lise Blog:
Einsichten, Ansichten, Aussichten

Linq to Entities

Einfach gesagt ist LINQ, bzw. eine LINQ-Abfrage, ein Ausdruck, welcher Daten von einer Datenquelle abruft. Dabei wird die Sprache von den spezialisierten Abfragesprachen vereinheitlicht. Beispielsweise SQL für relationale Datenbanken und XQuery für XML. LINQ-Abfragen bieten also eine einheitliche Möglichkeit, die Daten zu laden, obwohl verschiedene Schnittstellen zu diesen verwendet werden. [1]

Kurzbeschreibung LINQ-to-Entities

LINQ-to-Entities bietet Entwicklern eine Erweiterung, die es ermöglicht, Abfragen für das konzeptionelle Modell im Entity Framework zu schreiben. Abfragen für das Entity Framework werden als Befehlsstrukturabfragen dargestellt, die für den Objektkontext ausgeführt werden [2].
Nachdem der Entwickler eine LINQ-Abfrage erstellt hat, wird dies […] anschließend für die Datenquelle ausgeführt [3].

Auswirkung auf die erzeugten SQL-Anweisungen von LINQ-to-Entitie mit Entity Framework 6 & Core

In unseren Beispielen schauen wir uns LINQ-Abfragen an, welche eine boolesche Property in jeglicher Art und Weise nach WAHR und FALSCH prüft.

Wir wollen herausfinden, wie sich die verschiedenen Versionen von Entity Framework auf die Erzeugung der SQL-Queries von LINQ-Statements auswirken. Dazu verwenden wir Entity Framework 6 sowie Entity Framework Core.

In jedem Beispiel findest du ein LINQ-Statement und die daraus resultierenden SQL-Queries der verschiedenen Entity-Framework-Versionen. Du wirst sehen, dass sich die SQL-Queries nicht logisch, jedoch in der Syntax unterscheiden. Ohne ins Detail von Datenbank-Indizes zu gehen, ist es wichtig zu wissen, dass je nach Aufbau einer WHERE-Klausel in einem SQL ein Index von der Tabelle (effizienter) verwendet werden kann oder nicht. Zu jedem erzeugten SQL-Query findest du den Execution-Plan einer MySql Datenbank. Dieser Plan zeigt dir, welcher Index, auf welche Art verwendet werden kann und wie „teuer“ das Ausführen des Queries ist. Hier lässt sich einfach sagen, je „günstiger“ desto besser. Je nachdem, wie das Query erzeugt wird, kann ein Index effizienter verwendet werden. In der Datenbank befindet sich ein Index auf der Spalte IsDeleted.

Erkenntnis

Es wird deutlich, dass auf selber Code-Basis verschiedene SQL-Queries erzeugt werden, die unterschiedlich effizient arbeiten können. Aus eigener Erfahrung kann ich sagen, dass bei großen Datenmengen die Auswirkung auf die Performance spürbar ist. Daher empfehle ich bei der Verwendung von EF 6 und LINQ-to-Entitie genau darauf zu achten, wie das Statement verwendet und aufgebaut wird.

Fazit

Mit einem kleinen Augenzwinkern lässt sich sagen:

Achtet beim Schreiben von LINQ-Anweisungen, welche in einem SQL-Query resultieren, dass ihr immer sagt, was Ihr sucht und nicht, was Ihr nicht sucht. In der Eisdiele sagst du ja auch nicht, welche 15 der 18 Eissorten du nicht haben möchtest.