wake-up-neo.com

'Date' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätennavigationseigenschaften unterstützt

Ich versuche den folgenden Code auszuführen und erhalte einen Fehler

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
     var context = new LoggingEntities();
     var query = from t in context.Logs

           where t.Title == title 
           && t.Timestamp == LogDate

           select t;
     return query.ToList();
}

Der Fehler, den ich erhalte, lautet "Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entity-Navigationseigenschaften unterstützt." Ich habe verschiedene Versuche unternommen, alles auf eine Zeichenkette zu werfen, nur den Datumsteil zu vergleichen, aber es scheint nicht die richtige Kombination zu sein. Jede Hilfe wird sehr geschätzt.

47
mikemurf22

Nicht die beste Lösung, aber es funktioniert. Aus verschiedenen Gründen muss an dieser Stelle .net 3.5 verwendet werden, und das Ändern der Datenbank wäre schwierig. Wie auch immer, hier ist eine Lösung, die funktioniert:

            var query = from t in context.Logs
                      where t.Title == title 
                      && t.Timestamp.Day == LogDate.Day
                      && t.Timestamp.Month == LogDate.Month
                      && t.Timestamp.Year == LogDate.Year
                      select t;

Nicht die eleganteste Lösung, aber sie ist effektiv.

24
mikemurf22

Wenn Sie EF 6.0 oder höher verwenden, können Sie DbFunctions.TruncateTime(DateTime?) verwenden:

var query =
    from t in context.Logs
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date
    select t;

Hinweis: Bei älteren Versionen von EF, bei denen DbFunctions nicht verfügbar ist, kann stattdessen EntityFunctions.TruncateTime(DateTime?) verwendet werden.

86
Henrik Stenbæk
3
Rahul Nikate

Verwenden Sie immer EntityFunctions.TruncateTime () für x.DateTimeStart und LogDate .

var query = from t in context.Logs
              where t.Title == title 
              && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
              select t;
2
Babul Mirdha

Korrigieren Sie mich, wenn ich falsch liege, aber in mikemurf22s Beispiel müsste es jeden Teil der Datumskomponente überprüfen und möglicherweise viel mehr Serververarbeitung?

Auf jeden Fall bin ich auf dieses Problem gestoßen, und dies ist meine Lösung.

Wenn Sie davon ausgehen, dass Sie nur in der Datumskomponente übergeben werden, können Sie die letzte Minute des Tages ermitteln, an dem Sie vorbei sind, und die Where-Klausel verwenden, um den Bereich zu definieren.

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59)

    var query = from t in context.Logs
                where t.Timestamp >= date
                where t.Timestamp <= enddate
                select t;

    return query.ToList();
}
1
Mike

Konvertieren Sie LongDate in .ToShortDateStringund dann können Sie es folgendermaßen verwenden: 

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

wie Mike es tat

0
sansalk

Versuche dies:

var calDate = DateTime.Now.Date.AddDays(-90);

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
0
user3783446