Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq到SQL nvarchar问题_Sql_Linq_Linq To Sql_Indexing_Nvarchar - Fatal编程技术网

Linq到SQL nvarchar问题

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 如果

我发现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

如果参数是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线程,还有一些替代解决方法:谢谢。我已经意识到这只是一个包含的问题。一开始我认为它更广泛。