2009-06-30 89 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();