wake-up-neo.com

Wie vergleiche ich nur Datumskomponenten von DateTime in EF?

Ich habe zwei Datumswerte, von denen einer bereits in der Datenbank gespeichert ist 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 Picker 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
114
pencilslate

HINWEIS: Zum Zeitpunkt des Schreibens dieser Antwort war die EF-Beziehung unklar (das wurde in die Frage bearbeitet, nachdem dies geschrieben wurde). Überprüfen Sie Antwort von Mandeeps , um eine korrekte Annäherung mit EF zu erhalten.


Du kannst den ... benutzen DateTime.Date Eigenschaft, um nur einen Datumsvergleich durchzuführen.

DateTime a = GetFirstDate();
DateTime b = GetSecondDate();

if (a.Date.Equals(b.Date))
{
    // the dates are equal
}
120
Fredrik Mörk

Verwenden Sie die Klasse EntityFunctions zum Trimmen des Zeitanteils.

using System.Data.Objects;    

var bla = (from log in context.Contacts
           where EntityFunctions.TruncateTime(log.ModifiedDate) ==  EntityFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();

Quelle: http://social.msdn.Microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

[~ # ~] Update [~ # ~]

Ab EF 6.0 wird EntityFunctions durch DbFunctions ersetzt.

131
Mandeep Janjua

Ich denke, das könnte dir helfen.

Ich habe eine Erweiterung vorgenommen, da ich Daten in mit EF-Daten gefüllten Repositorys vergleichen muss. Das Datum war keine Option, da es in der LinqToEntities-Übersetzung nicht implementiert ist.

Hier ist der Code:

        /// <summary>
    /// Check if two dates are same
    /// </summary>
    /// <typeparam name="TElement">Type</typeparam>
    /// <param name="valueSelector">date field</param>
    /// <param name="value">date compared</param>
    /// <returns>bool</returns>
    public Expression<Func<TElement, bool>> IsSameDate<TElement>(Expression<Func<TElement, DateTime>> valueSelector, DateTime value)
    {
        ParameterExpression p = valueSelector.Parameters.Single();

        var antes = Expression.GreaterThanOrEqual(valueSelector.Body, Expression.Constant(value.Date, typeof(DateTime)));

        var despues = Expression.LessThan(valueSelector.Body, Expression.Constant(value.AddDays(1).Date, typeof(DateTime)));

        Expression body = Expression.And(antes, despues);

        return Expression.Lambda<Func<TElement, bool>>(body, p);
    }

dann können Sie es auf diese Weise verwenden.

 var today = DateTime.Now;
 var todayPosts = from t in turnos.Where(IsSameDate<Turno>(t => t.MyDate, today))
                                      select t);
24
jrojo

Wenn Sie die Eigenschaft Date für DB-Entitäten verwenden, erhalten Sie eine Ausnahme:

"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

Sie können so etwas verwenden:

  DateTime date = DateTime.Now.Date;

  var result = from client in context.clients
               where client.BirthDate >= date
                     && client.BirthDate < date.AddDays(1)
               select client;
10
algreat

Hier ist ein anderer Weg, dies zu tun, aber er ist nur nützlich, wenn SecondDate eine Variable ist, die Sie übergeben:

DateTime startDate = SecondDate.Date;
DateTime endDate = startDate.AddDays(1).AddTicks(-1);
...
e => e.FirstDate.Value >= startDate && e.FirstDate.Value <= endDate

Ich denke das sollte funktionieren

8
John Kaster

Um dies in LINQ to Entities zu tun, müssen Sie nterstützte Methoden verwenden:

var year = someDate.Year;
var month = ...
var q = from r in Context.Records
        where Microsoft.VisualBasic.DateAndTime.Year(r.SomeDate) == year 
              && // month and day

Hässlich, aber es funktioniert und es wird auf dem DB-Server durchgeführt.

8
Craig Stuntz

Sie können dies auch verwenden:

DbFunctions.DiffDays(date1, date2) == 0

6
user3829854

sie können hierfür die Methode DbFunctions.TruncateTime () verwenden.

e => DbFunctions.TruncateTime(e.FirstDate.Value) == DbFunctions.TruncateTime(SecondDate);
4
Harsh Vyas

Vergleichen Sie einfach immer die Date -Eigenschaft von DateTime anstelle der vollständigen Datumszeit.

Wenn Sie Ihre LINQ-Abfrage durchführen, verwenden Sie date.Date in der Abfrage, dh:

var results = from c in collection
              where c.Date == myDateTime.Date
              select c;
3
Reed Copsey

So mache ich das.

DateTime date_time_to_compare = DateTime.Now;
//Compare only date parts
context.YourObject.FirstOrDefault(r =>
                EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare));
3

// Hinweis für Linq-Benutzer/-Codierer

Dies sollte Ihnen den genauen Vergleich ermöglichen, um zu überprüfen, ob ein Datum innerhalb des Bereichs liegt, wenn Sie mit Eingaben von einem Benutzer arbeiten - beispielsweise Datumsauswahl:

((DateTime)ri.RequestX.DateSatisfied).Date >= startdate.Date &&
        ((DateTime)ri.RequestX.DateSatisfied).Date <= enddate.Date

dabei sind Startdatum und Enddatum Werte aus einer Datumsauswahl.

2
Leo Di Salty

Nur wenn hier jemand ankommt, der googelt oder bingelt ... Kompilierte Workarounds:

http://blog.integratedsolution.eu/post/2011/02/06/The-specified-type-member-Date-is-not-supported-in-LINQ-to-Entities.aspx

1
Braulio

Ohne Zeit, als versuchen Sie es so:

TimeSpan ts = new TimeSpan(23, 59, 59);
toDate = toDate.Add(ts);
List<AuditLog> resultLogs = 
    _dbContext.AuditLogs
    .Where(al => al.Log_Date >= fromDate && al.Log_Date <= toDate)
    .ToList();
return resultLogs;
1

Sie können den folgenden Link verwenden, um 2 Daten ohne Zeit zu vergleichen:

private bool DateGreaterOrEqual(DateTime dt1, DateTime dt2)
        {
            return DateTime.Compare(dt1.Date, dt2.Date) >= 0;
        }

private bool DateLessOrEqual(DateTime dt1, DateTime dt2)
        {
            return DateTime.Compare(dt1.Date, dt2.Date) <= 0;
        }

die Compare-Funktion gibt 3 verschiedene Werte zurück: -1 0 1, dh dt1> dt2, dt1 = dt2, dt1

1
majid

Probieren Sie es aus ... Der Vergleich von Datumseigenschaften zwischen zwei DateTimes-Typen ist in Ordnung:

PS. Es ist eine Notlösung und eine wirklich schlechte Praxis, sollte nie verwendet werden, wenn Sie wissen, dass die Datenbank Tausende von Datensätzen bringen kann ...

query = query.ToList()
             .Where(x => x.FirstDate.Date == SecondDate.Date)
             .AsQueryable();
0
Raskunho