【问题标题】:How to add year to LINQ to entities query?如何将年份添加到 LINQ 到实体查询?
【发布时间】:2021-08-25 12:53:38
【问题描述】:

我正在尝试使用 LINQ to 实体查询 SQL 中的表,并将年份添加到日期列。

我已尝试以下查询:

data = data.Where(x => x.DueDate.Value.AddYears(1) >= DateTime.Now);

执行此操作时,我收到以下错误消息:

LINQ to Entities 无法识别方法 'System.DateTime AddYears(Int32)' 方法,并且该方法无法转换为存储表达式。

我做了一些研究,似乎大多数人通过将查询分离出来并使用他们输入到表达式中的变量来解决这个问题。

我不能这样做,因为我需要将年份添加到我的数据 lambda 表达式中并且无法将它们分开。

有没有一种简单的方法来解决这个问题,或者有没有一种方法可以创建一个伪列来增加一年而不实际创建一个实际的表列?我试图避免仅仅为了在显示的日期上添加一年而创建一个全新的 SQL 列。

感谢您的帮助。

【问题讨论】:

    标签: c# sql asp.net-mvc linq


    【解决方案1】:

    您可以进行逆运算并从 DateTime.Now 中减去 1 年,并将其用作比较值。

    var yearAgo = DateTime.Now.AddYears(-1); 
    data = data.Where(x => x.DueDate >= yearAgo);
    

    旁注

    1. 比较值具有时间分量,但基于持久值DueDate 的命名可能没有时间分量。您可以使用.Date (DateTime.Now.Date.AddYears(-1);) 或.Today 而不是.Now (DateTime.Today.AddYears(-1);) 来移除时间组件。
    2. 如果在不同的时区工作,您将需要更强大的解决方案。我建议阅读 Jon Skeet 的 Storing UTC Is Not a Silver Bullet

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      相关资源
      最近更新 更多