web-dev-qa-db-fra.com

LINQ to Entities ne reconnaît pas la méthode «System.TimeSpan Subtract (System.DateTime)»

J'essaie de sélectionner des enregistrements dans la base de données en 60 jours 30 jours 20 jours de différence dans la date actuelle.

Veuillez voir cette requête ci-dessous.

 var uploads = (
                from files in _fileuploadRepository.Table
                join product in _productRepository.Table on files.Event equals product.Id
                where
                    (
                product.EventDate != null &&
                    (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
                    &&
                files.IsSkiped == false
                select files;
            ).ToList();

Mais une erreur s'est produite cette requête.

enter image description here

I am clueless. Please Help.

34
Ragesh S

L'approche la plus simple consiste à déterminer les limites avant vous effectuez la requête:

// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead.
DateTime now = DateTime.Now;
DateTime nowPlus60Days = now.AddDays(60);
DateTime nowPlus30Days = now.AddDays(30);
DateTime nowPlus20Days = now.AddDays(20);

var query = ...
            where product.EventDate <= nowPlus60Days
            ...

Notez que votre requête actuelle n'a même pas vraiment de sens, car chaque clause "ou" d indique que le calcul donné est à la fois inférieur ou égal à une valeur et supérieur ou égal à la même valeur. Si vous voulez un simple "égal à", utilisez-le. Sinon, il n'est pas clair ce que vous êtes en train de faire.

Si vous essayez de regrouper les valeurs en "moins de 20", "20-30", "30-60", "plus de 60", vous devrez utiliser le regroupement d'une certaine forme.

36
Jon Skeet

Vous pouvez utiliser le EntityFunctions.DiffDays méthode

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days

MISE À JOUR

EntityFunctions est désormais obsolète, vous devez donc utiliser DBFunctions à la place.

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
54
scartag

Cela devrait fonctionner:

using System.Data.Entity.SqlServer;

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
4
Dmitry Stepanov

Pour ajouter à la réponse de scartag,

Le documentation MSDN pour DbFunctions.DiffDays ne mentionne pas directement si et quand la valeur retournée par DiffDays () sera négative, j'ai donc pensé fournir ces informations ici:

Le résultat sera négatif lorsque la date de l'argument 1 est supérieure (c'est-à-dire à l'avenir par rapport à) la date de l'argument 2.

Par exemple, étant donné une table Deliveries avec un champ non nul ScheduledDeliveryDate qui peut avoir des valeurs dans le passé et dans le futur par rapport à la date actuelle, cette requête obtiendra tous les enregistrements avec un date/heure de livraison dans les 2 jours suivant la date/heure actuelle (passée et future):

DateTime now = DateTime.Now;
var results = from d in Deliveries
    where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2
        && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2)
    select d;
3
Jon Schneider