c# - 如何将年份添加到 LINQ 到实体查询?
问题描述
我正在尝试使用 LINQ to 实体查询 SQL 中的表,并将年份添加到日期列。
我尝试了以下查询:
data = data.Where(x => x.DueDate.Value.AddYears(1) >= DateTime.Now);
当我这样做时,我收到以下错误消息:
LINQ to Entities 无法识别方法 'System.DateTime AddYears(Int32)' 方法,并且此方法无法转换为存储表达式。
我已经做了一些研究,似乎大多数人通过将查询分离出来并使用他们然后输入到表达式中的变量来解决这个问题。
我不能这样做,因为我需要将年份添加到我的数据 lambda 表达式中并且无法将它们分开。
有没有一种简单的方法来解决这个问题,或者有没有一种方法可以创建一个增加一年而不实际创建实际表列的伪列?我试图避免仅仅为了在显示的日期上添加一年而创建一个全新的 SQL 列。
谢谢你的帮助。
解决方案
您可以进行逆运算并从中减去 1 年DateTime.Now
并将其用作比较值。
var yearAgo = DateTime.Now.AddYears(-1);
data = data.Where(x => x.DueDate >= yearAgo);
旁注
- 比较值具有时间分量,但基于持久值的命名
DueDate
可能没有时间分量。您可以使用.Date
(DateTime.Now.Date.AddYears(-1);
) 或.Today
代替.Now
(DateTime.Today.AddYears(-1);
) 来删除时间分量。 - 如果在不同的时区工作,您将需要更强大的解决方案。我建议阅读Jon Skeet的 Storing UTC Is Not a Silver Bullet。
推荐阅读
- netsuite - 在 Suitescript 2.0 的销售订单中保存项目行时出错
- reactjs - React Context 在消费者中没有显示价值
- ssl - Nginx DataPower 2 路 TLS
- html - 我有自己的用 bootstrap4 设计的投资组合,我使用模态进行反馈,我需要在没有谷歌表单的谷歌表格中获得访问者的反馈
- sql-server - 半胜以上队伍的输出(例:3/5)
- sql - 如何在纯 SQL 中转换查询结果以获得更好的可读性
- excel - Outlook 字段和等效属性
- java - java - 如何在Java Swing中拥有不会不断变化/闪烁颜色的简单动画形状?
- r - 使用 dplyr 将“开始停止数据”(又名转码)转换为长格式(又名时间码)
- javascript - 涉及大写字母时,JavaScript 不删除文本