'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge
J'essaie d'exécuter le code suivant et je reçois une erreur
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();
}
L'erreur que je reçois est "le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge."J'ai essayé diverses tentatives de lancer everythign sur une chaîne, en comparant seulement la partie date, mais je n'arrive pas à obtenir la bonne combinaison. Toute aide est grandement appréciée.
8 réponses
Si vous utilisez EF 6.0+, vous pouvez utiliser DbFunctions.TruncateTime(DateTime?)
:
var query =
from t in context.Logs
where t.Title == title
&& DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date
select t;
Remarque: Pour les versions antérieures de EF où
DbFunctions
n'est pas disponible,EntityFunctions.TruncateTime(DateTime?)
peut être utilisé à la place.
Pas la meilleure solution, mais ça marche. Pour diverses raisons, je dois utiliser. Net 3.5 à ce stade et modifier la base de données serait difficile. Quoi qu'il en soit, voici une solution qui fonctionne:
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;
Pas la solution la plus élégante, mais elle est efficace.
EntityFunctions.TruncateTime (T. Timestamp) est obsolète depuis EF6.
Utiliser ci-dessous
Utilisez toujours EntityFunctions.TruncateTime() pour X. DateTimeStart et LogDate. tels que:
var query = from t in context.Logs
where t.Title == title
&& EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
select t;
Corrigez-moi si je me trompe, mais dans l'exemple de mikemurf22, il faudrait vérifier chaque partie du composant date, et potentiellement beaucoup plus de traitement du serveur?
Quoi qu'il en soit, je suis tombé sur ce problème, et c'est ma solution.
En supposant que vous ne passerez que le composant date, vous pouvez trouver la dernière minute du jour où vous passerez et utiliser la clause where pour définir la plage.
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();
}
Convertissez LongDate en .ToShortDateString
et vous pouvez l'utiliser de cette façon:
EntityFunctions.TruncateTime(t.Timestamp) == LogDate
Comme mike l'a fait
Essayez ceci:
var calDate = DateTime.Now.Date.AddDays(-90);
var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
Vous pouvez utiliser ce hack:
DateTime startDate = LogDate.Date;
DateTime endDate = LogDate.Date.AddDays(1);
var query = from t in context.Logs
where t.Title == title
&& t.Timestamp >= startDate
&& t.Timestamp < endDate
select t;