LINQ to SQL不会生成可查询的查询
本文关键字:查询 to SQL LINQ | 更新日期: 2023-09-27 18:25:47
我正在使用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.活跃的列,显著降低查询速度:
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数据上下文支持将SQL结果映射到类似Linq的实体。在你的情况下,我建议写:
IEnumerable<Dog> results = db.ExecuteQuery<Dog>(
"SELECT * FROM dbo.Dogs where Active = {0}",
'A');
这是一个老问题,但我最近遇到了这个问题。
而不是写
from d in myDataContext.Dogs where d.Active == 'A' select d;
写入
from d in myDataContext.Dogs where d.Active.Equals('A') select d;
这将生成所需的SQL,而不必求助于其他答案中提到的任何"技巧"。我不能肯定为什么。
我已经把它作为一个问题发布了,所以我们会看看是否有好的答案。
对于将LINQ查询转换为SQL语句的方式,您无能为力,但您可以编写一个包含查询的存储过程,并将该SP作为LINQ2SQL函数调用。通过这种方式,您应该可以充分利用SQL Server优化
您可以进行一些破解(因为LINQ to SQL和EF通常需要这样做)。在dbml中将属性声明为NCHAR
。我希望这将消除进行UNICODE
转换的需要。我们正在以一种善意的方式欺骗L2S。
也许您还需要插入EntityFunctions.AsNonUnicode
调用,使右侧成为非unicode类型。
您也可以尝试将列映射为varchar
。