首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架EDMX强制DateTime2

实体框架EDMX强制DateTime2
EN

Stack Overflow用户
提问于 2015-01-10 15:10:04
回答 1查看 522关注 0票数 0

我正在进行一些数据库优化,我发现我的主要问题之一是,使用"exec sp_executesql“比使用原始SQL要慢得多。我认为这与/datetime 2转换有关,因为所有缓慢的查询都在比较日期。

在"exec sp_executesql“的末尾总是有这样的东西:

代码语言:javascript
复制
)))',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7),@p__linq__2 datetime2(7),@p__linq__3 datetime2(7),@p__linq__4 datetime2(7),@p__linq__5 datetime2(7),@p__linq__6 datetime2(7),@p__linq__7 datetime2(7),@p__linq__8 datetime2(7)',@p__linq__0='2015-01-09 18:52:46.9264744',@p__linq__1='2015-01-09 18:52:16.926',@p__linq__2='2015-01-09 18:52:16.926',@p__linq__3='2015-01-09 18:52:16.926',@p__linq__4='2015-01-09 18:52:16.926',@p__linq__5='2015-01-09 18:52:16.926',@p__linq__6='2015-01-09 18:52:16.926',@p__linq__7='2015-01-09 18:52:16.926',@p__linq__8='2015-01-09 18:52:16.926';

在我的数据库中,.NET datetime作为日期时间存储。我的模型是从我的EDMX生成的。

这里是我的问题,我是应该更改所有的日期时间字段,还是可以避免这种无用的隐含转换?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-18 13:25:31

我可以证实这种行为(EF 6.1.0)。问题是EF转换查询阻止SQL server使用索引(如果您的DateTime列被索引)。示例:

代码语言:javascript
复制
exec sp_executesql N'... WHERE ([Extent1].[Timestamp] >= @p__linq__0) AND ([Extent1].[Timestamp] <= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2014-03-01 0:00:00',@p__linq__1='2015-03-01 0:00:00'

注意查询条件(日期时间)和参数数据类型(Datetime2)之间的差异。

一个快速的解决方法是将您的DateTime参数声明为可空,这将向转换的查询条件添加额外的强制转换,使用索引。

代码语言:javascript
复制
exec sp_executesql N'...WHERE ( CAST( [Extent1].[Timestamp] AS datetime2) >= @p__linq__0) AND ( CAST( [Extent1].[Timestamp] AS datetime2) <= @p__linq__1)',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2014-03-01 0:00:00',@p__linq__1='2015-03-01 0:00:00'

据推测,这在6.1.2中是固定的,还没有时间来确认。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27877673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档