Я использую LINQ To Sql (не Entity Framework), библиотеку System.Data.Linq.DataContext, попав в базу данных SQL Server 2005 и используя .NET Framework 4.
В таблице dbo.Dogs есть столбец "Active" типа CHAR (1) NULL. Если бы я писал прямой SQL, запрос был бы следующим:
SELECT * FROM dbo.Dogs where Active = 'A';
Запрос LINQ таков:
from d in myDataContext.Dogs where d.Active == 'A' select d;
SQL, который генерируется из вышеуказанного запроса LINQ, преобразует поле Active в UNICODE. Это означает, что я не могу использовать индекс в столбце dbo.Dogs.Active, значительно замедляя запрос:
SELECT [t0].Name, [t0].Active
FROM [dbo].[Dog] AS [t0]
WHERE UNICODE([t0].[Active]) = @p1
Есть ли что-нибудь, что я могу сделать, чтобы остановить Linq до Sql от вставки этого вызова UNICODE() и, таким образом, потерять преимущество моего индекса на dogs.Active)? Я попытался обернуть параметры с помощью метода EntityFunctions.AsNonUnicode(), но это не принесло пользы (он вставил CONVERT() в NVARCHAR вместо UNICODE() в сгенерированном sql), например:
...where d.Active.ToString() == EntityFunctions.AsNonUnicode('A'.ToString());