私は LINQ To Sql (Entity Framework ではない)、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 で UNICODE() の代わりに CONVERT() を NVARCHAR に挿入しました)。
...where d.Active.ToString() == EntityFunctions.AsNonUnicode('A'.ToString());