2013-03-07 3 views
30

J'essaie de sélectionner des enregistrements dans la base de données dans 60 jours 30 jours 20 jours différents en date du jour.LINQ to Entities ne reconnaît pas la méthode 'System.TimeSpan Subtract (System.DateTime)' méthode

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 est survenue lors de cette requête.

enter image description here

Je suis désemparés. S'il vous plaît aidez.

+1

-vous en dehors des calculs de l'instruction lambda. Quand il est dans le lambda comme vous l'utilisez, vous essayez que EntityFramework fasse le calcul quand ce n'est pas fait. – Middas

+0

Ainsi, LINQ to SQL ne "traduira" pas une expression comme "product.EventDate.Subtract (DateTime.Now)". En C#, une notation alternative est 'product.EventDate - DateTime.Now' où l'on utilise [une surcharge de l'opérateur moins (' -')] (http://msdn.microsoft.com/en-us/library/1905yhe2. aspx). Est-ce que quelqu'un sait si _that_ fonctionnera avec LINQ to SQL?Après tout, la soustraction des dates est également possible dans les dialectes SQL. –

+0

@JeppeStigNielsen Pour EF, vous pouvez utiliser EntityFunctions.DiffDays – scartag

Répondre

33

L'approche la plus simple est d'élaborer 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 ne permet même pas vraiment de sens, comme chacun »ou« clause d est indiquant 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 simple "égal à" alors utilisez-le. Si ce n'est pas le cas, il n'est pas clair ce que vous êtes essayant de faire.

Si vous essayez de placer les valeurs dans "moins de 20", "20-30", "30-60", "plus de 60", vous devrez utiliser un regroupement de certaines formes.

44

Vous pouvez utiliser la méthode EntityFunctions.DiffDays

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

MISE À JOUR

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

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now) 
+16

EntityFunctions est maintenant obsolète: utilisez plutôt System.Data.Entity.DbFunctions. – celerno

2

Pour ajouter à la réponse de scartag,

Le MSDN documentation for DbFunctions.DiffDays ne mentionne pas directement si et quand la valeur retournée par DiffDays() sera négatif, donc je pensais que je fournir cette information ici:

Le résultat sera négatif lorsque l'argument 1 date est supérieur à (c'est-à-dire dans le futur par rapport à) l'argument 2 date. Par exemple, étant donné un tableau 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 une date/heure de livraison comprise entre 2 et jours de la date/heure (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

Cela devrait fonctionner:

using System.Data.Entity.SqlServer; 

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60 
Questions connexes