web-dev-qa-db-fra.com

LINQ to Entities pour soustraire 2 dates

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

58
Michael I

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

42
Michael I

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

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.

19
Ladislav Mrnka

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.

11
Micah

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

1
Mahmoodvcs

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

0
oknevermind