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.
I am clueless. Please Help.
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.
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)
Cela devrait fonctionner:
using System.Data.Entity.SqlServer;
where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
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;