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 type de membre 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 pour transformer chaque chaîne en chaîne, en comparant seulement la partie de date, mais je n'arrive pas à obtenir la bonne combinaison. Toute aide est grandement appréciée.
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;
Ce n’est pas la solution la plus élégante, mais c’est efficace.
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.
EntityFunctions.TruncateTime (t.Timestamp) est obsolète à partir de EF6.
Utilisez 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 de date et potentiellement plus de traitement de serveur?
Quoi qu'il en soit, je suis tombé sur ce problème et c'est ma solution.
En supposant que vous ne transmettiez que le composant de date, vous pouvez trouver la dernière minute du jour que vous transmettez 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 utilisez-le de cette façon:
EntityFunctions.TruncateTime(t.Timestamp) == LogDate
comme Mike l'a fait
Essaye ça:
var calDate = DateTime.Now.Date.AddDays(-90);
var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)