我有一个简单的问题,但我自己无法找到答案.
我正在使用EF4 CTP-5 Code First Model和手工生成的POCO.它正在处理生成的SQL中的字符串比较
WHERE N'Value' = Object.Property
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下方法覆盖此功能:
[Column(TypeName = "varchar")]
public string Property {get;set;}
Run Code Online (Sandbox Code Playgroud)
这解决了该单个事件的问题并正确生成SQL为:
WHERE 'Value' = Object.Property
Run Code Online (Sandbox Code Playgroud)
但是,我正在处理一个非常大的域模型并遍历每个字符串字段并设置TypeName ="varchar"将非常非常繁琐.我想指定EF应该在整个板上看到字符串为varchar,因为这是该数据库中的标准,nvarchar是例外情况.
想要纠正这个问题的推理是查询执行效率.varchar和nvarchar之间的比较在SQL Server 2k5中非常低效,其中varchar到varchar比较几乎立即执行.
我正在玩EF 5和代码.到目前为止我真的很喜欢它,但我注意到它默认字符串列为nvarchar.如果我想使用varchar,那么我必须明确告诉它.
我可以强制它为字符串使用varchar而不是nvarchar,如下所示:
public class Member
{
public int id { get; set; }
[MaxLength(255), Required, Column(TypeName = "varchar")]
public string firstName { get; set; }
[MaxLength(255), Required, Column(TypeName = "varchar")]
public string surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我几乎在所有情况下都会使用varchar而不是nvarchar,所以我更希望将字符串列全局映射到varchar,并且如果需要的话,能够在每列的基础上设置nvarchar.
有谁知道这样做的方法?我试图省略为模型中的每个字符串列键入[Column(TypeName ="varchar")]的需要.
我们使用实体框架进行数据库访问,当我们"思考"LIKE语句时 - 它实际上生成了CHARINDEX的东西.所以,这里有两个简单的查询,在我简化它们以证明某个服务器上的一个点之后:
-- Runs about 2 seconds
SELECT * FROM LOCAddress WHERE Address1 LIKE '%1124%'
-- Runs about 16 seconds
SELECT * FROM LOCAddress WHERE ( CAST(CHARINDEX(LOWER(N'1124'), LOWER([Address1])) AS int)) = 1
Run Code Online (Sandbox Code Playgroud)
表现在包含大约100k条记录.地址1是VarChar(100)字段,没什么特别的.
这是两个并排的计划.没有任何意义,显示50%和50%,但执行时间像1:8

我在网上搜索,一般的建议是使用CHARINDEX而不是LIKE.根据我们的经验,情况正好相反.我的问题是导致这个以及如何在没有代码更改的情况下修复它的原因