LINQ to Entities:在Lambda Expression中使用DateTime.AddMonth

时间:2009-06-30 16:14:06

标签: c# linq lambda

我一直在阅读一些帖子,但我找不到解决LINQ To Entities,Lambda Expressions和DateTime.AddMonth的问题。

问题是我正在尝试在Lambda Expression中使用DateTime.AddMonth而我收到此错误:

  

“LINQ to Entities无法识别方法'System.DateTime   AddMonths(Int32)'方法,这个方法无法翻译成   商店表达“

当我执行这段代码时:

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。

3 个答案:

答案 0 :(得分: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 :(得分: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();

答案 2 :(得分:0)

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