Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在实体框架中比较日期以避免舍入错误?_Entity Framework_Datetime_Rounding Error - Fatal编程技术网

Entity framework 如何在实体框架中比较日期以避免舍入错误?

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

我有一个.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中转换这两种类型,这只会导致错误“无法将类型'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分钟处理一次),因此,将其回退一整秒钟甚至比将其回退剩下的毫秒更安全。我有与您完全相同的要求/范例:上次编辑日期。我之所以选择利用最大精度,是因为:不存在零概率:)(稍后将讨论较少的问题)。