ObjectQueryのStartsWith/Contains/EndsWithはLIKEと違う。

LINQ to Entitiesは落とし穴の宝庫。

DataGridViewで顧客リストの前方一致による絞込みをするため、LIKEを使いたかった。調べてみると、StartsWithでできるらしい。

.Where(u => u.name_kana.StartsWith(tbxKeyNameKana.Text))

実際にやってみると、ASCII文字列の場合は使えるが、マルチバイト文字列の場合は常にどれにもマッチしないという結果になる。

ObjectQuery.ToTraceString()を使ってSQLを見ると、こんなWHERE句になっていた。

WHERE (CHARINDEX(@p__linq__4, [Extent3].[name_kana])) = 1

よくわからんが、素直にLIKEを出してくれ。

SQLに近い書き方もできるようだ。それでこうした。

.Where("it.name_kana LIKE @keyNameKana", new ObjectParameter("keyNameKana", tbxKeyNameKana.Text.Replace("%", @"%")+"%"));

ところで、SQL Serverならばこういう選択肢もあるのかもしれない(未確認)。

.Where(u => u.name_kana.Substring(0, tbxKeyNameKana.Text.Length) == tbxKeyNameKana.Text)

SQLiteではSubstringなんてないと言われてできなかった。

現状のEFには不満がつのる。.NET Framework 4.0では大幅に強化されるというが、VS2008のままで対応できるのかなー。

参考:

Anyway to get at ToTraceString form LINQ to Entities query?

コメントを残す