Fluent NHibernate自動マッピングを使用するシステムがあります。私はここ3「類似」の制限を使用するときのNHibernate値の切り捨て
mapping.Map(x => x.CCY1Code).Length(3);
の長さにマッピングされている文字列プロパティを持っていることは、私は建物だ制約の例です:SQL Serverプロファイラでこれを見
Restrictions.Like("CCY1Code", "USD", MatchMode.Anywhere);
、それが見えますNHibernateのようにSQLをパラメータ化しています。しかし、これを行う際には3文字に制限しています。しかし、NHibernateはまた、パーセント記号で私の価値 "USD"を取り巻いています。したがって、 "%USD%"は "%US"に切り捨てられます。 SQL Serverプロファイラからいくつか抜粋している。ここ:この問題を回避するために5つの文字に自分のフィールドを長くする以外
CCY1Code like @p9
@p9 nvarchar(3)
@p9=N'%US'
、この問題に対処する他の方法はありますか?
+1 Iで説明したように、あなたも
Like
様々な表現を使用してすることができますので、NHibernateの者の一部からバグが間違いであることをここに追加したいと思います これはすばらしい答えだと思う、前にこのように考えることはなかった。 US%と%USの両方がテーブルスキャンではなくインデックスを使用していることを100%確信していますか? (MsSQlのみ) – Rippoいいえ、最初の部分だけがインデックスを使用しているとは言えません。それが「米国%」です。もう片方はデフォルトのテーブルスキャンにしかなりませんが、最初の部分が成功すれば実行されません – Jaguar
これはバグであることを確認したのでこれをマークします。私は何かシンプルなものを見逃していたと思っていたが、私はそうは思わない! 3文字のトークンを持つ3文字のフィールドでLikeを行うのは、通常は無意味だと私は同意します。しかし、私の特別なケースでは、ユーザーには高度なフィルタリングオプションが提示されます。彼らは "等"または "好き"を選択することができ、したがって3文字を入力する可能性があります。 – SkipHarris