Ich benutze Entity Framework 6 mit Oracle und Sql. Der Timespan-Datentyp funktioniert nicht mit Oracle. Also habe ich den Datentyp in datetime geändert. Jetzt möchte ich nur die Zeit in Datetime mit Linq Abfrage vergleichen. Ex.
%Vor%im obigen Beispiel e.ExecutionTime ist datetime und viewmodel.ExecutionTime ist der Zeitraum. Ich benutze timeofday Funktion, um es in Zeitspanne
zu konvertierenoben Abfrage konnte nicht ausgeführt werden, so dass ich DbFunctions.CreateTime () -Funktion
verwendet %Vor%oben ex exeptime ist timespan.still ich bekomme unter Fehler
%Vor%Wegen der Datums- und Zeitprobleme bei Orakel machen wir es nur als String:
%Vor%In der Quelle können Sie eine DateTime-Parsing-Eigenschaft hinzufügen:
%Vor%Nicht die schönste Version, aber funktioniert.
Dies ist ein Oracle-basiertes Problem in den DbFunctions. Wenn Sie das sql-log aktivieren, sehen Sie, dass eine Funktion "CREATETIME ()" verwendet wird, die unbekannt ist.
Aktiviere sql-log: ctx.Database.Log = Console.WriteLine;
Das Protokoll sieht folgendermaßen aus:
%Vor%Wenn Sie nur die Zeit vergleichen möchten, in der Sie die unterstützten kanonischen EDM-Funktionen von DbFunctions verwenden können (siehe hier ). Leider wird DbFunction.CreateTime nicht unterstützt.
Wenn Sie sich jedoch für einen Vergleich auf der Ebene von Sekunden interessieren, können Sie Folgendes tun:
%Vor%Hier nehmen Sie den Unterschied in Sekunden mit der EDM-Funktion DiffSeconds und machen den Modulus mit der Anzahl der Sekunden pro Tag.
Die Abfrage, die ausgeführt wird, lautet:
%Vor%Wie Sie sehen, wird es korrekt in die Oracle-Funktionen serverseitig übersetzt.
Ich hoffe es hilft,
Nicola
Der EF6 Query-Übersetzer unterstützt DateTime.TimeOfDay
nicht und der Oracle-Provider unterstützt nicht DbFunctions.CreateTime
und TimeSpan
Parameter / Konstanten.
Es gibt immer noch einige Optionen, bevor Sie den Speicher von DateTime
auf string
umschalten, wie von einer anderen Antwort vorgeschlagen.
Erstens können Sie für Gleichheitsprüfungen die Zeitkomponenten vergleichen, indem Sie sie entweder in separate Variablen (Abfrageparameter) extrahieren:
%Vor% oder in falsche DateTime
Variable (queryParameter):
Zweitens können Sie mit der Zeit in Sekunden umgewandelt werden. So können Sie auch einen Vergleich durchführen:
%Vor%Aber das alles manuell zu tun ist ziemlich ärgerlich und fehleranfällig. Was ich anbieten kann, ist eine kleine Utility-Klasse, die eine benutzerdefinierte Erweiterungsmethode bietet:
%Vor% Er verwendet zwei kleine benutzerdefinierte ExpressionVisitor
-Klassen, um die Eigenschaften DateTime.TimeOfDay
und TimeSpan
ähnlich wie in viewModel.ExecutionTime
zu konvertieren.
Nun sollten Sie Ihre ursprüngliche Abfrage wie folgt verwenden:
%Vor% Falls Sie Millisekunden anstelle von Sekunden verwenden möchten, müssen Sie die ersten beiden Anweisungen in TimeSpanConverter
class wie folgt ändern:
Tags und Links c# entity-framework linq oracle odp.net