Linq到SQL nvarchar问题
我发现LINQtoSQL中存在一个巨大的性能问题 当使用字符串从表中进行选择时,传递给sql server的参数始终是nvarchar,即使sql表是varchar。这导致了表扫描而不是搜索,这是一个巨大的性能问题Linq到SQL nvarchar问题,sql,linq,linq-to-sql,indexing,nvarchar,Sql,Linq,Linq To Sql,Indexing,Nvarchar,我发现LINQtoSQL中存在一个巨大的性能问题 当使用字符串从表中进行选择时,传递给sql server的参数始终是nvarchar,即使sql表是varchar。这导致了表扫描而不是搜索,这是一个巨大的性能问题 var q = ( from a in tbl where a.index == "TEST" select a) var qa = q.ToArray(); 该参数作为nvarchar传递,这将导致整个索引在使用之前从varchar转换为nvarchar 如果
var q = (
from a in tbl
where a.index == "TEST"
select a)
var qa = q.ToArray();
该参数作为nvarchar传递,这将导致整个索引在使用之前从varchar转换为nvarchar
如果参数是varchar,则它是一个非常快速的搜索
有没有办法覆盖或更改此选项
谢谢
当做
Craig.Hmmm。这是LINQ到SQL的预RTM版本中的一个已知错误,但从我在线阅读的内容来看,对于RTM中的相等性比较来说,这是一个固定问题(尽管对于Contains()比较来说仍然是一个坏问题) 不管怎样,这里有一个MSDN论坛上的线程,详细介绍了一些解决方法: 我最喜欢的解决方法是:
//define a query
IQueryable<Employee> emps = from emp in dc2.Employees where emp.NationalIDNumber == "abc" select emp;
//get hold of the SQL command translation of the query...
System.Data.Common.DbCommand command = dc2.GetCommand(emps);
//change param type from "string" (nvarchar) to "ansistring" (varchar)
command.Parameters[0].DbType = DbType.AnsiString;
command.Connection = dc2.Connection;
//run
IEnumerable<Employee> emps2 = dc2.Translate<Employee>(command.ExecuteReader());
//定义查询
IQueryable emp=来自dc2中的emp。emp.NationaldNumber==“abc”选择emp的员工;
//获取查询的SQL命令转换。。。
System.Data.Common.DbCommand command=dc2.GETCOMAND(emps);
//将参数类型从“字符串”(nvarchar)更改为“ansistring”(varchar)
command.Parameters[0].DbType=DbType.AnsiString;
command.Connection=dc2.Connection;
//跑
IEnumerable emps2=dc2.Translate(command.ExecuteReader());
顺便说一句,我看到的另一种情况是,在一个值分布不规则的表中(例如,50%的表具有相同的值),这意味着,鉴于SQL Server在计划编译时不知道参数,表扫描是可用的最佳计划。如果您的发行版也是不寻常的,那么上面的解决方法将不起作用,因为扫描不会来自丢失的转换,而是来自参数化本身。在这种情况下,我知道的唯一解决方法是使用OPTIMIZE FOR提示并手动指定SQL。您的DBML是什么样子的?它是一个varchar列,而不是一个nvarchar列。create table test(test varchar(200)not null)create index ixtest on test(test)数据库查询计划使用CONVERT_IMPLICIT和扫描而不是seek。我认为这是一个常见的LINQ到SQL问题。我正在寻找一种可以正确指定参数的解决方法。而在nvarchar(4)上使用varchar(200),这会导致转换。+1.:)这里是另一个msdn线程,还有一些替代解决方法:谢谢。我已经意识到这只是一个包含的问题。一开始我认为它更广泛。