Dans mon application, j'utilise Entity Framework.
Ma table
-Article
-period
-startDate
J'ai besoin d'enregistrements qui correspondent => DateTime.Now > startDate and (startDate + period) > DateTime.Now
J'ai essayé ce code mais ça marche maintenant
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
Lorsque je lance mon code, l'exception suivante se produit
LINQ to Entities ne reconnaît pas la méthode Méthode 'System.DateTime AddDays (Double)' et cette méthode ne peut pas être traduite en une expression de magasin.
Lorsque vous utilisez LINQ to Entity Framework, vos prédicats de la clause Where sont traduits en SQL. Vous obtenez cette erreur car il n'y a pas de traduction SQL pour DateTime.Add()
, ce qui est logique.
Une solution rapide consisterait à lire les résultats de la première instruction Where en mémoire, puis à utiliser LINQ to Objects pour terminer le filtrage:
Context.Article.Where(p => p.StartDate < DateTime.Now)
.ToList()
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now);
Vous pouvez également essayer la méthode EntityFunctions.AddDays si vous utilisez .NET 4.0:
Context.Article.Where(p => p.StartDate < DateTime.Now)
.Where(p => EntityFunctions.AddDays(p.StartDate, p.Period)
> DateTime.Now);
Note: Dans EF 6
la neige System.Data.Entity.DbFunctions.AddDays
.
Je pense que c'est ce que la dernière réponse essayait de suggérer, mais plutôt que d'essayer d'ajouter des jours à p.startdat (quelque chose qui ne peut pas être converti en une instruction sql), pourquoi ne pas faire quelque chose qui puisse être assimilé à sql:
var baselineDate = DateTime.Now.AddHours(-24);
something.Where(p => p.startdate >= baselineDate)
Pourquoi ne pas soustraire 2 jours à DateTime.Now:
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))
Pour être honnête, je ne sais pas trop ce que vous essayez d’atteindre, mais cela peut marcher
Si vous avez besoin que votre expression soit traduite en SQL, vous pouvez essayer d'utiliser
Méthode System.Data.Entity.Core.Objects.AddDays.
En fait, c'est marqué obsolète mais ça marche. Il devrait être remplacé par System.Data.Entity.DbFunctions.AddDays mais je ne le trouve pas ...