2009-06-30 102 views
2

我一直在阅读一些帖子,但是我没有找到解决方案来解决LINQ To Entities,Lambda Expressions和DateTime.AddMonth的问题。LINQ to Entities:在Lambda表达式中使用DateTime.AddMonth

的问题是,我试图用DateTime.AddMonth lambda表达式内,我收到此错误:当我执行这段代码

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

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

是有一种方法可以避免这种异常,但保持相同的行为?

我对Linq,Lambdas或Entity Framework了解不多。

非常感谢您提前!

Gsus。

+0

是您要添加到PAYMENTDATE月数的o.Products.ProductCategories.Commissionable和值的Int32? – jvanderh 2009-06-30 16:20:59

+0

您应该标记此问题Linq和C# – jvanderh 2009-06-30 16:25:38

回答

0

LINQ to Entities将您的linq表达式转换为SQL代码,有时这种转换是无缝的,如整数加法,选择,组等,但有时候抽象会泄漏,就像日期操作一样。

2

您可以在不过滤日期的情况下返回必要的信息,然后过滤日期。 (当然,我不确定你的数据的大小是多少,所以这可能是低效的,如果是这样的话,你需要一种基于SQL的解决方案 - 可能是存储过程。)

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

这会将查询的AddMonths部分转换为Linq-to-Objects方法,而不是Linq-to-Entities调用。

1

试试这个,

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();