13

私は 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());
4

4 に答える 4

4

これは古い質問ですが、最近これに出くわしました。

書く代わりに

from d in myDataContext.Dogs where d.Active == 'A' select d;

書く

from d in myDataContext.Dogs where d.Active.Equals('A') select d;

これにより、他の回答で言及されている「ハック」に頼ることなく、目的の SQL が生成されます。理由ははっきりとは言えません。

質問として投稿したので、良い回答が得られるかどうかを確認します。

于 2016-03-07T21:49:09.673 に答える
4

Linq は、クエリの記述を容易にすることを目的としており、常に最適な SQL を生成するとは限りません。高いパフォーマンスが必要な場合は、生の SQL をデータベースに対して直接書き込む方が効率的です。Linq データコンテキストは、linq と同様にエンティティへの SQL 結果のマッピングをサポートしています。あなたの場合、私は書くことをお勧めします:

IEnumerable<Dog> results = db.ExecuteQuery<Dog>(
                           "SELECT * FROM dbo.Dogs where Active = {0}", 
                           'A');
于 2013-07-31T21:55:08.753 に答える
1

You can do a little hack (as it is often required with LINQ to SQL and EF). Declare the property as NCHAR in the dbml. I hope that will remove the need to do the UNICODE conversion. We are tricking L2S in a benign way with that.

Maybe you need to also insert the EntityFunctions.AsNonUnicode call to make the right hand side a non-unicode type.

You can also try mapping the column as varchar.

于 2013-07-31T21:49:31.600 に答える