2

char(1) Status 列を持つ古いデータベースがあります。コードを最初に使用し、エンティティ フレームワーク 4.3.1 を使用してデータベースとやり取りしています。私のコードの最初のクラスのステータス列は次のように定義されています。

[Column(TypeName = "char")]
public string Status { get; set; }

Status がいくつかの値のいずれかであるすべてのアイテムを取得するための linq クエリを作成しています。コードは次のようになります (簡略化されています)。

List<string> statusList = new List<string>() {"N","H","P"};
...
var entries = (from t in context.MyTable where statusList.Conains(t.Status)).ToList();
...

生成された SQL は、すべての Status 値の前に N を付けて、クエリを非常に遅くします。

WHERE ([Extent1].[Status] IN (N'N', N'P', N'P'))

ユニコードと非ユニコードを比較しているため、ステータス列のインデックスを使用できないようです。

他のlinqクエリでも同様の問題が発生したことがありますが、プロパティに [Column(TypeName = "char")] を配置することで解決したと思いました。

SQL がすべての Status 値の前にこれらの N を置かないようにする方法を知っている人はいますか? statusList を char のリストにしようとしましたが、最初にコードで Status 列の定義を char に変更する必要がありましたが、エラーがスローされました。

ありがとうデビッド

4

1 に答える 1

1

.NET Framework 4 を使用していますか? これは、.NET Framework 4.5 に同梱されている EF5 コア ライブラリで修正されたと思います。これに対する接続バグは次のとおりです。 like-clause接続バグには回避策も含まれています - EntityFunctions.AsNonUnicode() 関数を使用して、文字列を強制的に Unicode にしないようにします。これは、.NET Framework 4.5 に移行できない場合に役立ちます。

于 2012-10-13T20:50:01.637 に答える