在LINQ to Entities 查询中,使用常规日期格式转换函数Convert.ToDateTime()以及日期比较函数TimeSpan.Subtract().Days,都很麻烦而且会出错:LINQ to Entities不能识别方法。。。
那么要想在LINQ to Entities 查询中,计算两个日期之间相差的天数,该怎么办呢?
别慌,.NET已经为你准备好了工具!
System.Data.Entity提供公共语言运行时(CLR)方法,公开EDM规范函数。
用于System.Data.Entity.DbContext或System.Data.Entity.Core.Objects.ObjectContext。
LINQ to Entities查询。
命名空间 System.Data.Entity 包含许多有用的方法,每一类方法都包含好多个重载方法。其中包括但不限于:
AddDays: public static DateTime? AddDays(DateTime? dateValue, int? addValue);
摘要:
//当用作LINQ to Entities查询的一部分时,此方法将调用规范
// AddDays EDM功能可将给定天数添加到日期/时间。
//
//参数:
// dateValue:
//输入日期/时间。
//
// addValue:
//要添加的天数。
//
//返回结果:
//结果日期/时间。
//
//备注:
//你不能直接调用这个函数。 此功能只能出现在
//一个LINQ to Entities查询。 此功能转换为相应的功能
//在数据库中
AddHours:public static TimeSpan? AddHours(TimeSpan? timeValue, int? addValue);
//
//摘要:
//当用作LINQ to Entities查询的一部分时,此方法将调用规范
// AddHours EDM功能可将给定的小时数添加到时间跨度。
//
//参数:
// timeValue:
//输入日期/时间。
//
// addValue:
//要添加的小时数。
//
//返回结果:
//结果时间跨度
//
//备注:
//你不能直接调用这个函数。 此功能只能出现在
//一个LINQ to Entities查询。 此功能转换为相应的功能
//在数据库中
以及AddMicroseconds,AddMinutes,AddMonths等以Add开头的方法就不一一介绍了,感兴趣的可以用vs自行查看。
AsNonUnicode:public static string AsNonUnicode(string value);
//
//摘要:
//当用作LINQ to Entities查询的一部分时,此方法充当运算符
//确保输入被视为非Unicode字符串。
//
//参数:
//值:
//输入字符串
//
//返回结果:
//输入字符串被视为非Unicode字符串。
//
//备注:
//你不能直接调用这个函数。 此功能只能出现在
//一个LINQ to Entities查询。 此函数会影响LINQ查询的转换方式
//可以在数据库中运行的查询。
以及AsUnicode。
DiffDays:public static int? DiffDays(DateTime? dateValue1, DateTime? dateValue2);
//
//摘要:
//当用作LINQ to Entities查询的一部分时,此方法将调用规范
// DiffDays EDM函数用于计算两个日期/时间之间的天数。
//
//参数:
// dateValue1:
//第一个日期/时间
//
// dateValue2:
//第二个日期/时间
//
//返回结果:
//第一个和第二个日期/时间之间的天数。
//
//备注:
//你不能直接调用这个函数。 此功能只能出现在
//一个LINQ to Entities查询。 此功能转换为相应的功能
//在数据库中
以Differ开头的方法也有很多,就不一一介绍了。
这里有一个问题,上述的DiffDays方法能返回两个日期之间相差的天数,但是并没有强调顺序,也就是说传入两个日期,虽然能知道相隔的天数,但是却不知道谁比谁多。
同样是相隔两天,早两天和晚两天,意义上可能就差很多。
所以要根据自己的需要,灵活的使用各种工具方法。
不过,虽然文档中没有指出两个参数的顺序对结果的影响,但是经过实践,得知:第二个参数与第一个参数比较,大则为正,相等则为零,小则为负。