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.
je suis paumé. S'Il Vous Plaît Aider.
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.
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)
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;
Cela devrait fonctionner:
using System.Data.Entity.SqlServer;
where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60