我有一个.NET DateTime值,我写入SQL Server数据库“datetime”字段(并且相信我,我希望我们只使用“datetime2(7)”完全符合.NET的DateTime精度,但我们'不是)。
无论如何,我将实体写入数据库,该特定字段最终为'2016-03-03 08:55:19.560'。
这是最后一个处理时间,我正在寻找在之前处理过的其他记录。当我运行一个实体框架where子句时,它最终运行一个以“@ p__linq__0 ='2016-03-03 08:55:19.5602354'”结尾的语句作为它所比较的值,最终会略微增大,即使这两个值来自完全相同的DateTime实例。
我尝试更改它与SqlDateTime进行比较的时间,但是lambda不能编译,因为它无法比较DateTime?到SqlDateTime。 SqlDateTime有比较方法,但我不知道实体框架是否识别这些函数。
我甚至无法在两个实体框架之间进行转换,它只是给出错误“无法将类型'System.DateTime'转换为'System.Data.SqlTypes.SqlDateTime'.LINQ to Entities仅支持转换EDM原语或枚举类型。“
答案 0 :(得分:2)
我面临同样的问题。在我的例子中,我最终使用:
来评估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;