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 to SQL不会生成可查询的查询

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