Extended Linq 2 Entities mit DbFunctions

Extended Linq 2 Entities mit DbFunctions
 LINQ to Entities ist ein mächtiges sprachliches Mittel, um effizient und typisiert Datenbank-Abfragen im .NET-Code formulieren zu können. Doch werden die Abfragen komplexer und umfassen schließlich spezifische .NET-Framework-Klassen sowie deren Methoden, so ist das Ende der Fahnenstange erreicht. Denn: LINQ to Entities kann natürlich nicht zaubern und ist nur in der Lage Ausdrücke in Datenbank-Abfragen umzuwandeln, die so auch auf der Datenbank zur Verfügung stehen. Und dieser Satz ist dann -zumindest im Vergleich zum vollständigen .NET-Framework- doch stark eingeschränkt.

Ich stieß an diese Grenze, als ich die Differenz zweier DateTime-Objekte ermitteln wollte, um in einer where-Klausel einen Vergleich damit durchzuführen. Kein Problem in .NET, doch der SQL Server kann damit nicht umgehen und so kommt es bei Ausführung der Query zu einer Exception:

var fastOrders = dbContext.Orders
    .Where(order => order.DeliveredAt - order.CreatedAt < TimeSpan.FromHours(8))
    .ToList();

"DbArithmeticExpression arguments must have a numeric common type."

Abhilfe verschaffte mir in diesem Fall die statische Klasse DbFunctions (ehemals EntityFunctions), die im Namespace System.Data.Entity zur Verfügung steht. Zur Beschreibung der Klasse: „Provides common language runtime (CLR) methods that expose EDM canonical functions for use in DbContext or ObjectContext LINQ to Entities queries„. Damit ist auch ihr Zweck erklärt: DbFunctions stellt zusätzliche Methoden zur Verfügung, die in einer LINQ to Entities Abfrage verwendet werden können und damit die Ausdrucksmächtigkeit erhöhen.

In meinem Fall der Differenz zweier DateTime-Objekte und des Vergleichs half mir DbFunctions.AddHours() sowie eine Re-Definition des Ausdrucks:

var fastOrders = dbContext.Orders
    .Where(order => order.DeliveredAt < DbFunctions.AddHours(order.CreatedAt, 8))
    .ToList();

Und darüber hinaus stehen in DbFunctions noch eine ganze Reihe anderer Methoden zur Verfügung:

  • Hilfsmethoden für DateTime
    • Addition (Millisekunden bis Jahre)
    • Subtraktion
    • Differenz-Bildung
    • Berechnung des UTC-Offsets
    • Erzeugung von DateTime’s
    • Abschneiden der Zeit von einem DateTime
  • Hilfsmethoden für String
    • Umwandlung in Unicode bzw. Nicht-Unicode
    • Left/Right-Operationen
    • String-Umkehrung (Reverse)
  • Mathematische Hilfsmethoden
    • Berechnung der Standardabweichung einer Menge von Zahlen
    • Berechnung der Varianz einer Menge von Zahlen
    • Abschneiden des Dezimalteils aus einer Menge von Zahlen
Ich bin freiberuflicher Senior C#/.NET Softwareentwickler im Raum Frankfurt/Main. Mit Leidenschaft für Software-Design, Clean Code und moderne Technologien in den Bereichen Web, Win und Mobile.

2 Kommentare

  1. Daniel 2 Jahren vor

    Prima Sache, kannte ich noch nicht. Wobei ich trotzdem kein Fan von Entity Framework werde 😉

    • Autor

      Wenn man mit den Macken umzugehen weiß (gerade in detached Szenarien), ist es schon ne coole Sache 😉

Eine Antwort hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*