J'essaie de déterminer le nombre de jours entre 2 dates en utilisant LINQ avec Entity Framework. Il me dit qu'il ne reconnaît pas Subtract sur la classe System.TimeSpan
Voici ma partie where de la requête LINQ.
where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays))
Voici l'erreur que je reçois dans le débogueur VS.NET
{"LINQ to Entities ne reconnaît pas la méthode 'System.TimeSpan Subtract (System.DateTime)', et cette méthode ne peut pas être traduite en une expression de magasin."}
Suis-je en train de faire quelque chose de mal ou existe-t-il un meilleur moyen d'obtenir le nombre de jours entre 2 DateTimes dans le cadre de l'entité?
merci Michael
Voici comment je l'ai fait fonctionner
J'ai défini une variable datetime qui représente la date la plus ancienne
DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0));
...
puis j'ai modifié la partie where de la requête LINQ
where (vid.CreatedDate >= oldestDate )
travaillé comme un charme - merci Micah de m'avoir fait penser à l'arbre d'expression
La réponse acceptée est meilleure dans ce cas, mais pour référence, vous pouvez utiliser la classe EntityFunctions
pour effectuer des opérations sur des dates, entre autres.
where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))
Vous pouvez aussi utiliser System.Data.Objects.EntityFucntions
:
currentDate = DateTime.Now;
...
where EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays
Toutes les fonctions de EntityFunctions
sont réservées aux entités Linq et sont mappées aux fonctions SQL.
Vous rencontrez ce genre de problèmes car le prédicat doit être traduit en une arborescence d'expression. Et le processus de traduction ne reconnaît pas la méthode DateTime.Now.Subtract.
Le fait est que de par sa conception, LINQ to Entities doit traduire la requête entière en instructions SQL. C'est là qu'il ne peut pas reconnaître la méthode Subtract. Cela se produit chaque fois que vous essayez d'utiliser une méthode C #/VB dans une requête. Dans ces cas, vous devez trouver un moyen de faire ressortir cette partie de la requête. Cet article explique un peu plus: http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx
Vous pouvez définir une nouvelle propriété dans votre modèle:
public DateTime StartDate{ get; set; }
public DateTime EndDate{ get; set; }
public TimeSpan CalculateTime{
get
{
return EndDate.Subtract(StartDate);
}
}
Maintenant, vous pouvez utiliser quelque chose comme ça:
var query = from temp in db.Table
select new MyModel {
Id = temp.Id,
Variable1 = temp.Variable1,
...
EndDate = temp.EndDate,
StartDate = temp.StartDate
}
Lorsque vous avez regardé le résultat, vous pouvez utiliser un retour tel que:
return query
Maintenant, dans la requête, nous avons CalculateTime (soustrayez EndDate et Startdate).