有没有简单的方法来比较日期,忽略年份,使用Linq和实体框架?
说我有以下
var result = context.SomeEntity.Where(e => e.SomeDate > startDate);
这假设SomeDate和startDate是.NET DateTime的。
我想要做的是比较这些日期而不比较年份。 SomeDate可以是任何一年。有没有简单的方法来做到这一点?我能想到的唯一方法是使用以下内容:
var result = context.SomeEntity(e =>
e.SomeDate.Month > startDate.Month ||
(e.SomeDate.Month == startDate.Month && e.SomeDate.Day >= startDate));
如果我想要一个endDate,这种方法会变得更加复杂,因为我必须做一些事情,例如考虑到开始日期是在年末,结束日期是在开始时
有什么简单的方法可以解决这个问题吗?
更新
我最后只是按照我最初在帖子中想到的方式来解决这个问题......对于一些概念上很简单的代码来说,这是很多代码。基本上只需要查找日期是否在一个范围内,忽略年份,并且如果startDate>循环日历。 endDate如果有人知道更简单的方法,请发帖,因为我仍然感兴趣。
答案 0 :(得分:1)
略微简单的方式
var result = context.SomeEntity(e =>
e.SomeDate.Month * 100 + e.SomeDate.Day > startDate.Month * 100 + startDate.Day
);
您还可以创建用户定义的函数(假设使用SQL服务器),并且该函数可以在查询中使用。
答案 1 :(得分:0)
如果您确实只需要比较日期(而不是时间),那么DateTime.DayOfYear
属性可能有所帮助。但在这种情况下,你应该小心闰年。除此之外我无法想象比数月和日比较简单的方法。
如果你关心的是这个方法在引入第二个比较后会变得更复杂,那么简单的方法提取应该会有所帮助。
另一种方法可能是创建一个扩展方法,该方法将返回适用于您的比较的数字。例如,让我们调用此方法GetYearIgnoringOrdinal()
:
public static int GetYearIgnoringOrdinal(this DateTime date)
{
return date.Month*100 + date.Day;
}
然后像这样使用它:
var result = context.SomeEntity.Where(e => e.SomeDate.GetYearIgnoringOrdinal() > startDate.GetYearIgnoringOrdinal());