Entity framework 如何在实体框架中比较日期以避免舍入错误?
我有一个.NET DateTime值,我将其写入SQL Server数据库的“DateTime”字段(相信我,我希望我们只使用与.NET的DateTime精度完全匹配的“datetime2(7)”,但事实并非如此) 无论如何,我将实体写入数据库,该特定字段最终为“2016-03-03 08:55:19.560” 这是最后一次处理时间,我正在查找在此之前处理过的其他记录。当我运行一个实体框架where子句时,它会运行一个以“@p_ulinq_u0='2016-03-03 08:55:19.5602354'”结尾的语句作为其比较的值,该值会稍微大一些,即使这两个值来自完全相同的DateTime实例 我尝试将其比较的时间更改为SqlDateTime,但是lambda无法编译,因为它无法比较DateTime?到一个特定的时间。SqlDateTime有比较方法,但我不知道EntityFramework是否识别这些函数Entity framework 如何在实体框架中比较日期以避免舍入错误?,entity-framework,datetime,rounding-error,Entity Framework,Datetime,Rounding Error,我有一个.NET DateTime值,我将其写入SQL Server数据库的“DateTime”字段(相信我,我希望我们只使用与.NET的DateTime精度完全匹配的“datetime2(7)”,但事实并非如此) 无论如何,我将实体写入数据库,该特定字段最终为“2016-03-03 08:55:19.560” 这是最后一次处理时间,我正在查找在此之前处理过的其他记录。当我运行一个实体框架where子句时,它会运行一个以“@p_ulinq_u0='2016-03-03 08:55:19.5602
我甚至无法在entity framework中转换这两种类型,这只会导致错误“无法将类型'System.DateTime'转换为类型'System.Data.SqlTypes.SqlDateTime'。LINQ to Entities仅支持转换EDM基元或枚举类型。”我面临同样的问题。在我的例子中,我最终使用以下方法对DateTime字段进行赋值:
public static DateTime RoundedToMs(this DateTime dt) {
return new DateTime(dt.Ticks - (dt.Ticks % TimeSpan.TicksPerMillisecond), dt.Kind);
}
public static DateTime RoundedToMsForSql(this DateTime dt) {
DateTime n = dt.RoundedToMs();
return new DateTime(n.Year, n.Month, n.Day, n.Hour, n.Minute, n.Second, (n.Millisecond / 10) * 10);
}
在业务代码中:
someEntity.SomeDate = dateValue.RoundedToMsForSql();
在我的例子中,关键是sql datetime的精度是3ms,所以我决定去掉毫秒单位
在查询中可以使用相同的扩展,事实上可以填充查询中使用的变量
var d = DateTime.Now.RoundedToMsForSql();
var q = from e in ctx.Entities where e.SomeDate <= d;
var d=DateTime.Now.RoundedToMsForSql();
var q=从ctx.Entities中的e开始,其中e.SomeDate所需的时间精度是多少-到最近的秒?厘米秒?毫秒?没有要求的精度。关键是,如果我有一个名为“Fred”的DateTime属性的模型,它会被写入“DateTime”类型的数据库字段中,该字段不太准确,并且会被截断。如果我使用相同的“Fred”属性运行linq查询,并将其与写入的字段进行比较。。。。entity framework将使用日期的字符串表示形式填充查询参数,该字符串表示形式的精度比它写入字段的精度高,因此与自身的比较总是失败。在进行比较时,我能够通过将值首先强制转换为SqlDateTime,然后直接返回到DateTime来修复它。这似乎就像比较成功一样,截断了它,但我不确定它有多可靠。这很酷。我最后只是这样做:var truncatedDate=(DateTime)(SqlDateTime)originalDate代码>这似乎很有效。我甚至更进一步,只是在我的特殊情况下减去了整整一秒,因为这个值是一个“最后处理”的时间,无论如何我都不想每秒处理超过一次(应该是每30分钟处理一次),因此,将其回退一整秒钟甚至比将其回退剩下的毫秒更安全。我有与您完全相同的要求/范例:上次编辑日期。我之所以选择利用最大精度,是因为:不存在零概率:)(稍后将讨论较少的问题)。