Vergleiche nur die Zeit von datetime in enitity framework 6 mit odp.net Oracle 12c

9

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 konvertieren

oben 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%     
dvirus 06.11.2017, 11:33
quelle

4 Antworten

1

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%     
kara 14.11.2017, 07:12
quelle
1

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

    
N. Carrer 14.11.2017 13:14
quelle
1

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):

%Vor%

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:

%Vor%     
Ivan Stoev 16.11.2017 22:17
quelle
0

Sie können sowohl Oracle-Zeitspannen als auch SQL-Daten in Zeichenfolgen konvertieren und dann vergleichen. Wie:

%Vor%     
Shuvra 13.11.2017 15:41
quelle