LINQ to SQL不会生成sargable查询

Tom*_*gan 13 .net c# linq-to-sql

我正在使用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';
Run Code Online (Sandbox Code Playgroud)

LINQ查询是这样的:

from d in myDataContext.Dogs where d.Active == 'A' select d;
Run Code Online (Sandbox Code Playgroud)

从上面的LINQ查询生成的SQL将Active字段转换为UNICODE.这意味着我无法在dbo.Dogs.Active列上使用索引,从而显着减慢查询速度:

SELECT [t0].Name, [t0].Active
FROM [dbo].[Dog] AS [t0]
WHERE UNICODE([t0].[Active]) = @p1
Run Code Online (Sandbox Code Playgroud)

有什么办法可以阻止Linq到Sql插入那个UNICODE()调用(从而失去了我对dogs.Active索引的好处)吗?我尝试使用EntityFunctions.AsNonUnicode()方法包装参数,但这没有用(它在生成的sql中将一个CONVERT()插入NVARCHAR而不是UNICODE()),例如:

...where d.Active.ToString() == EntityFunctions.AsNonUnicode('A'.ToString());
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 1

您可以进行一些修改(因为 LINQ to SQL 和 EF 通常需要这样做)。NCHAR按照dbml 中的方式声明属性。我希望这将消除进行转换的需要UNICODE。我们正在以一种良性的方式欺骗​​ L2S。

也许您还需要插入调用EntityFunctions.AsNonUnicode以使右侧成为非 unicode 类型。

您还可以尝试将列映射为varchar.

  • 或者,使用“.Equals”而不是“==”会生成没有“UNICODE”函数调用的 SQL。至于为什么,我也不清楚。 (3认同)