我们在我们的业务解决方案中使用 EF 5.0 作为我们选择的 ORM,以 n 层方式构建,所有内容都解耦,并使用 ninject 构建了一个很好的组合根。
最近,我们一直在构建一个在底层使用分区的数据库,并且我们在DATE
列上有一些重要的索引。
在 Sql Server 2008 上正确声明了这些列。我们还在 EF 映射中添加了正确的数据类型,以及HasColumnType("Date")
指令。
尽管如此,当通过 Linq to Entities 查询表时,我们过滤日期的参数是创建类型的DateTime2
,甚至列也在DateTime2
查询中被强制转换,因此类型与参数匹配。
这种行为有几个问题。首先,如果我告诉 EF 引擎数据库上的列是DATE
它为什么要把它转换成DateTime2
?
其次,这种转换使数据库忽略索引,因此不使用分区。我们每个物理分区有一年,如果我问一个日期范围,比如说 2013 年 2 月到 2013 年 3 月,扫描应该只发生在一个物理分区上。如果手动使用正确的数据类型,它会正常工作,DATE
但DateTime2
会扫描所有分区的强制转换,从而大大降低性能。
现在,我确定我错过了一些东西,因为如果 Microsoft ORM 在 Microsoft Sql Server 上不能很好地工作,那将是相当愚蠢的。
我一直找不到任何关于 EF 如何在查询中使用正确数据类型的文档,所以我在这里问。任何帮助将不胜感激。
谢谢。