web-dev-qa-db-fra.com

Linq à DateTime EntityFramework

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.

99
Yucel

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 .

185
Justin Niessner

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)
87
andrew

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

3
TimC

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 ...

2
bubi