LINQ to Entities ne reconnaît pas le système de la méthode.Durée Soustraction(Système.Méthode DateTime)"

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

s'il vous Plaît 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 est survenue dans cette requête.

enter image description here

je suis paumé. S'Il Vous Plaît Aider.

31
demandé sur Ragesh S 2013-03-07 10:09:54

4 réponses

l'approche La plus simple est de travailler sur 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 simplement "égal à" alors utilisez cela. Si non, il n'est pas clair ce que vous essaie de faire.

Si vous essayez de les valeurs dans "moins de 20", "20-30", "30-60", "plus de 60" vous aurez besoin d'utiliser le groupement d'un certain formulaire.

33
répondu Jon Skeet 2013-03-07 06:16:24

vous pourriez utiliser le EntityFunctions.DiffDays méthode

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

UPDATE

EntityFunctions est maintenant obsolète donc vous devriez utiliser DBFunctions à la place.

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
48
répondu scartag 2015-08-20 17:29:56

Pour les ajouter à scartag réponse,

MSDN documentation for DbFunctions.DiffDays ne mentionne pas directement si et quand la valeur renvoyée par DiffDays() sera négative, donc j'ai pensé que je fournirais cette information ici:

le résultat sera négatif lorsque la date de l'argument 1 est plus grande que (c.-à-d. dans l'avenir par rapport à) la date de l'argument 2.

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

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
répondu Jon Schneider 2016-01-07 17:41:08

Cela devrait fonctionner:

using System.Data.Entity.SqlServer;

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
3
répondu Dmitry S 2017-06-03 09:23:58