实体框架如何在生成的SQL(SQL Server 2005)Nvarchar vs Varchar中指定参数类型

时间:2010-06-03 19:47:14

标签: c# sql-server-2005 entity-framework parameters entity

在实体框架中,我有一个从数据库生成的实体“客户端”。有一个名为“帐户”的属性,它在存储模型中定义为:

 <Property Name="Account" Type="char" Nullable="false"  MaxLength="6" /> 

在概念模型中:

<Property Name="Account" Type="String" Nullable="false" />

使用Account的变量生成select语句时,即

where m.Account == myAccount...

实体框架使用NVarchar(6)类型的参数生成参数化查询。问题是表中的列是char(6)的数据类型。执行此操作时,由于数据类型不同,性能会受到很大影响。帐户是表上的索引,而不是使用索引,我相信索引扫描已完成。

任何人都知道如何强制EF不使用Unicode作为参数并使用Varchar(6)代替?

2 个答案:

答案 0 :(得分:2)

我想我找到了自己问题的答案。这里http://blogs.msdn.com/b/adonet/archive/2010/05/10/improvements-to-generated-sql-in-net-4-0.aspx

它讨论了在EF 4.0中生成sql的改进。特别是它说

  
    

提供有效的非Unicode查询机制     列

  
     

在.NET 3.5中,每当一个常量或一个   参数在LINQ to Entities中使用   查询,我们将其视为Unicode。   因此,在比较常数时   存储在非unicode中的属性   SQL Server上的列,如果有的话   该列的索引,它不是   正在使用。

     

为了解决这个问题,我们现在生成   非unicode常量和参数   当这些在LINQ中使用时   实体查询与比较   非unicode列。

我想我需要升级。

答案 1 :(得分:1)

该字段的属性窗口有3个属性可以满足您的要求,固定长度,最大长度和Unicode,当您在设计器中选择适当的字段时,它们位于属性窗口的Facets组中。 / p>

我目前正在关注EF4,我不确定它们是否存在于以前版本的EF中。

它最终应该在XML中看起来像这样。

<Property Name="Account" Type="String" MaxLength="6" Unicode="false" FixedLength="true" Nullable="false" />