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.
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.
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 stattdessenEntityFunctions.TruncateTime(DateTime?)
verwendet werden.
EntityFunctions.TruncateTime (t.Timestamp) ist obsolet von EF6.
Verwenden Sie unten
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;
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();
}
Konvertieren Sie LongDate in .ToShortDateString
und dann können Sie es folgendermaßen verwenden:
EntityFunctions.TruncateTime(t.Timestamp) == LogDate
wie Mike es tat
Versuche dies:
var calDate = DateTime.Now.Date.AddDays(-90);
var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)