2009-06-30 7 views
2

J'ai lu certains articles mais je ne trouve pas de solution à un problème que j'ai avec LINQ To Entities, Lambda Expressions et DateTime.AddMonth.LINQ to Entities: Utilisation de DateTime.AddMonth dans l'expression Lambda

Le problème est que je suis en train d'utiliser DateTime.AddMonth dans une expression Lambda et je reçois cette erreur:

"LINQ to Entities does not recognize the method 'System.DateTime AddMonths(Int32)' method, and this method cannot be translated into a store expression"

quand j'exécute ce morceau de code:

List<Orders> orders = context.Orders 
         .Where(o => o.IdOrderStatus == 1) 
         .Where(o => o.PaymentDate.Value.AddMonths(o.Products.ProductCategories.CommissionableMonths) > DateTime.Now) 
         .ToList(); 

Est existe-t-il un moyen d'éviter cette exception tout en conservant le même comportement? Je ne connais pas beaucoup Linq, Lambdas ou Entity Framework.

Merci beaucoup d'avance!

Gsus.

+0

est la valeur o.Products.ProductCategories.Commissionable et Int32 du nombre de mois que vous voulez ajouter à PaymentDate? – jvanderh

+0

Vous devez étiqueter cette question Linq et C# – jvanderh

+0

@jvanderh: Oui, est le nombre de mois que je veux ajouter à la date de paiement. @jvanderh: Je vais le marquer comme Liqn et C# Merci. –

Répondre

0

LINQ to Entities convertit votre expression linq en code SQL, parfois cette conversion est transparente comme l'addition d'entiers, les sélections, les groupes, etc., mais parfois l'abstraction fuit, comme dans les opérations de date.

2

Vous pouvez renvoyer les informations nécessaires sans filtrer la date, puis filtrer la date par la suite. (Bien sûr, je ne suis pas sûr de la taille de vos données, cela peut donc être inefficace, si besoin, vous aurez besoin d'une solution basée sur SQL - peut-être une procédure stockée.)

List<Orders> orders = context.Orders 
         .Where(o => o.IdOrderStatus == 1) 
         .ToList(); 
orders = orders.Where(o.PaymentDate.Value.AddMonths(o.Products.ProductCategories.CommissionableMonths) > DateTime.Now); 

Cela transforme la partie AddMonths de la requête en une méthode Linq-to-Objects au lieu de Linq-to-Entities.

+0

Merci John. Le PaymentDate est l'un des grands filtres dont nous avons besoin pour obtenir une petite quantité de données. Nous allons donc utiliser une procédure stockée pour résoudre ce problème. Cordialement. –

1

essayer,

var today =DateTime.Now; 
List<Orders> orders = context.Orders 
        .Where(o => o.IdOrderStatus == 1) 
        .Where(o => SqlFunctions.DateAdd("month" ,o.Products.ProductCategories.CommissionableMonths,o.PaymentDate) > today) 
        .ToList(); 
Questions connexes