我正在使用 LINQ To Sql(不是实体框架)、System.Data.Linq.DataContext 库,访问 SQL Server 2005 数据库并使用 .Net Framework 4。
表 dbo.Dogs 有一个类型为 CHAR(1) NULL 的“Active”列。如果我直接编写 SQL,查询将是:
SELECT * FROM dbo.Dogs where Active = 'A';
LINQ 查询是这样的:
from d in myDataContext.Dogs where d.Active == 'A' select d;
从上述 LINQ 查询生成的 SQL 将 Active 字段转换为 UNICODE。这意味着我无法使用 dbo.Dogs.Active 列上的索引,从而显着减慢查询速度:
SELECT [t0].Name, [t0].Active
FROM [dbo].[Dog] AS [t0]
WHERE UNICODE([t0].[Active]) = @p1
我可以做些什么来阻止 Linq to Sql 插入 UNICODE() 调用(从而失去在 dogs.Active 上索引的好处)?我尝试使用 EntityFunctions.AsNonUnicode() 方法包装参数,但这没有什么好处(它在生成的 sql 中将 CONVERT() 插入到 NVARCHAR 而不是 UNICODE() ),例如:
...where d.Active.ToString() == EntityFunctions.AsNonUnicode('A'.ToString());
Linq 旨在使编写查询变得更容易,但并不总是生成最佳 SQL。有时,当需要高性能时,直接针对数据库编写原始 SQL 会更有效,Linq datacontext 支持将 SQL 结果映射到实体,就像 linq 一样。
对于你的情况我建议写:
IEnumerable<Dog> results = db.ExecuteQuery<Dog>(
"SELECT * FROM dbo.Dogs where Active = {0}",
'A');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)