【发布时间】:2013-05-07 16:46:32
【问题描述】:
我们在我们的业务解决方案中使用 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 如何在查询中使用正确数据类型的文档,所以我在这里问。任何帮助将不胜感激。
谢谢。
【问题讨论】:
标签: c# .net sql-server entity-framework orm