【问题标题】:LINQ to Entities: Using DateTime.AddMonth in Lambda ExpressionLINQ to Entities:在 Lambda 表达式中使用 DateTime.AddMonth
【发布时间】:2009-06-30 16:14:05
【问题描述】:

我一直在阅读一些帖子,但没有找到解决 LINQ To Entities、Lambda 表达式和 DateTime.AddMonth 的问题的方法。

问题是我试图在 Lambda 表达式中使用 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、Lambda 或实体框架了解不多。

非常感谢您!

Gsus。

【问题讨论】:

  • o.Products.ProductCategories.Commissionable 和 Int32 值是您要添加到 PaymentDate 的月数吗?
  • 你应该标记这个问题 Linq 和 C#
  • @jvanderh:是的,是我想添加到付款日期的月数。 @jvanderh:我会把它标记为 Liqn 和 C# 谢谢。

标签: c# linq lambda


【解决方案1】:

您可以返回必要的信息而不过滤日期,然后过滤日期。 (当然,我不确定您的数据会有多大,所以这可能效率低下。如果是这样,您将需要某种基于 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 调用。

【讨论】:

  • 谢谢约翰。 PaymentDate 是我们需要获取少量数据的大过滤器之一,因此我们将使用存储过程来解决这个问题。问候。
【解决方案2】:

试试这个,

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2016-04-17
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多