首页 > 解决方案 > 如何将年份添加到 LINQ 到实体查询?

问题描述

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

我尝试了以下查询:

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

当我这样做时,我收到以下错误消息:

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

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

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

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

谢谢你的帮助。

标签: c#sqlasp.net-mvclinq

解决方案


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

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

推荐阅读