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
2 Kommentare
-
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 😉
-