Betrachten Sie meine Event
Klasse, und dass ich DateTime
in der DB als UTC-Daten speichern. Ich möchte einfach einen gefilterten Bereich basierend auf dem aktuellen Datum in einer bestimmten Zeitzone zurückgeben - einfach richtig?Warum wird LINQ to SQL durch eine Erweiterungsmethode ausgetrickst? was jetzt?
Dies funktioniert:
IQueryable<Event> test1 = this.GetSortedEvents().Where(e => e.FinishDateTime.Date >= DateTime.UtcNow.Date);
Dies funktioniert auch gut:
IQueryable<Event> test2 = this.GetSortedEvents().Where(e => e.FinishDateTime.AddHours(3).Date >= DateTime.UtcNow.AddHours(3).Date);
.. und erfüllt zusätzlich Anforderungen meine Zeitzone.
Also hier Ich denke ich diese spezifische Umwandlung aus dieser Erweiterung Methode bewegen kann:
public static DateTime RiyadhTimeFromUtc(this DateTime utcTime) { return utcTime.AddHours(3); }
arbeiten dies nicht:
IQueryable<Event> test3 = this.GetSortedEvents().Where(e => e.FinishDateTime.RiyadhTimeFromUtc().Date >= DateTime.UtcNow.RiyadhTimeFromUtc().Date);
.. und ich diese bekommen NotSupportedException: Die Methode 'System.DateTime RiyadhTimeFromUtc (System.DateTime)' hat keine unterstützte Übersetzung in SQL.
Dies ist natürlich Quatsch, da der Compiler es glücklich in SQL konvertiert hat, als der identische Code NICHT in der Erweiterungsmethode war.
Ich habe das Problem "hat keine unterstützte Übersetzung in SQL" vor mit bestimmten Typen und zuletzt DateTime's. Aber meine Tests oben und this link beweisen, dass die AddHours-Methode in der SQL-Übersetzung unterstützt werden sollte.
Wenn mir jemand sagen könnte, was ich falsch hier tun (oder eine andere Abhilfe Ansatz für dieses Problem) ich wirklich dankbar sein würde.
Das ist eine fantastische Erklärung. Aber ich weiß nicht, wie es mir noch hilft. Irgendwelche konkreten Vorschläge für mein Problem? –
Ich werde Linq Expressions verwenden, um es zu tun - http://www.albahari.com/nutshell/predicatebuilder.aspx Danke für Ihre Hilfe –