Linq à DateTime EntityFramework

c# datetime entity-framework linq

Question

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.

Réponse acceptée

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);

Remarque: dans EF 6 il s'agit maintenant de System.Data.Entity.DbFunctions.AddDays .


Réponse populaire

Je pense que c'est ce que cette 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)


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow