我一直在阅读一些帖子,但我找不到解决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。
答案 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代码,有时这种转换是无缝的,例如整数加法,选择,组等,但有时候抽象会泄漏,就像日期操作一样。