Ich habe zwei Datumswerte, von denen einer bereits in der Datenbank gespeichert und der andere vom Benutzer mit DatePicker ausgewählt wurde. Der Anwendungsfall besteht darin, in der Datenbank nach einem bestimmten Datum zu suchen.
Der zuvor in die Datenbank eingegebene Wert hat immer eine Zeitkomponente von 12:00:00, wobei das vom Kommissionierer eingegebene Datum eine andere Zeitkomponente hat.
Ich interessiere mich nur für die Datumskomponenten und möchte die Zeitkomponente ignorieren.
Wie kann dieser Vergleich in C # durchgeführt werden?
Wie geht das in LINQ?
UPDATE: Unter LINQ to Entities funktioniert Folgendes einwandfrei.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
c#
linq
entity-framework
linq-to-entities
datetime-comparison
Bleistiftscheibe
quelle
quelle
Antworten:
HINWEIS: Zum Zeitpunkt des Schreibens dieser Antwort war die EF-Beziehung unklar (die nach dem Schreiben in die Frage bearbeitet wurde). Überprüfen Sie für eine korrekte Vorgehensweise mit EF die Antwort von Mandeeps .
Mit der
DateTime.Date
Eigenschaft können Sie einen Nur-Datum-Vergleich durchführen.quelle
EntityFunctions.TruncateTime
jeden Fall scheint der Weg zu sein in diesen Tagen zu gehen (es wurde in .NET 4 zur Verfügung , die das Jahr veröffentlicht wurde , nachdem diese Frage gestellt wurde).Verwenden Sie die Klasse
EntityFunctions
zum Trimmen des Zeitanteils.Quelle: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
AKTUALISIEREN
Ab EF 6.0 und höher wird EntityFunctions durch DbFunctions ersetzt .
quelle
EntityFunctions
wurde zugunsten vonSystem.Data.Entity.DbFunctions
(mindestens) EF6 abgelehnt. Es könnte früher gewesen sein.Ich denke, das könnte dir helfen.
Ich habe eine Erweiterung vorgenommen, da ich Datumsangaben in mit EF-Daten gefüllten Repositorys vergleichen muss. Daher war das Datum keine Option, da es in der LinqToEntities-Übersetzung nicht implementiert ist.
Hier ist der Code:
dann können Sie es auf diese Weise verwenden.
quelle
Wenn Sie die
Date
Eigenschaft für DB-Entitäten verwenden, erhalten Sie eine Ausnahme:Sie können so etwas verwenden:
quelle
Um dies in LINQ to Entities zu tun, müssen Sie unterstützte Methoden verwenden :
Hässlich, aber es funktioniert und es wird auf dem DB-Server gemacht.
quelle
Hier ist eine andere Möglichkeit, aber es ist nur nützlich, wenn SecondDate eine Variable ist, die Sie übergeben:
Ich denke das sollte funktionieren
quelle
DateTime = x.Date;
mir fehlte. Wenn ichvar
den Wert im Vergleich verwendet habe oder hatte, ist er mit der gemeldeten Ausnahme fehlgeschlagen. Vielen Dank.e.FirstDate.Value <= endDate
, könnene.FirstDate.Value < endDate
Sie das entfernen.AddTicks(-1)
.Sie können auch Folgendes verwenden:
DbFunctions.DiffDays(date1, date2) == 0
quelle
Sie können hierfür die Methode DbFunctions.TruncateTime () verwenden.
quelle
Vergleichen Sie einfach immer die Date- Eigenschaft von DateTime anstelle der vollständigen Datums- und Uhrzeitangabe.
Wenn Sie Ihre LINQ-Abfrage durchführen, verwenden Sie date.Date in der Abfrage, dh:
quelle
candidate.Date >= base.Date
. Theoretisch muss diecandidate.Date
Zeit> = 12:00:00 sein, daher ist die Verwendung der Date-Eigenschaft überflüssig, aber ich werde mich an Reeds Rat halten.So mache ich das.
quelle
// Hinweis für Linq Benutzer / Codierer
Dies sollte Ihnen den genauen Vergleich geben, um zu überprüfen, ob ein Datum in den Bereich fällt, wenn Sie mit Eingaben einer Benutzer-Datumsauswahl arbeiten, zum Beispiel:
Dabei sind Startdatum und Enddatum Werte aus einer Datumsauswahl.
quelle
Ohne Zeit als versuchen Sie so:
quelle
Sie können den folgenden Link verwenden, um 2 Daten ohne Zeit zu vergleichen:
Die Vergleichsfunktion gibt 3 verschiedene Werte zurück: -1 0 1, was dt1> dt2, dt1 = dt2, dt1 bedeutet
quelle
Versuchen Sie dies ... Es funktioniert gut, Datumseigenschaften zwischen zwei DateTimes-Typen zu vergleichen:
PS. Es ist eine Notlösung und eine wirklich schlechte Praxis. Sie sollte niemals verwendet werden, wenn Sie wissen, dass die Datenbank Tausende von Datensätzen enthalten kann ...
quelle