2012-01-17 17 views
0

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' 

、この問題に対処する他の方法はありますか?

答えて

4

これは部分的にバグだと思います。

トークン自体が3文字の長さの場合、3文字のフィールドでLikeと検索するのは意味がありません。代わりにEqualsを使用すると、インデックスが利用されるようになります(設定されている場合)。

「%米国%」を検索するときにあなたががバグに分類されますが、回避策として、クエリを実行するために、次のようになります。最初の部分はまた、インデックスの利用にかかるので、それは良いでしょう

Restrictions.Like("CCY1Code", "US", MatchMode.Start) 
     || Restrictions.Like("CCY1Code", "US", MatchMode.End) 

切り捨てを回避しながら

編集:私はちょうどこれがhttp://msdn.microsoft.com/en-us/library/ms179859.aspx

+0

+1 Iで説明したように、あなたもLike様々な表現を使用してすることができますので、NHibernateの者の一部からバグが間違いであることをここに追加したいと思います これはすばらしい答えだと思う、前にこのように考えることはなかった。 US%と%USの両方がテーブルスキャンではなくインデックスを使用していることを100%確信していますか? (MsSQlのみ) – Rippo

+0

いいえ、最初の部分だけがインデックスを使用しているとは言えません。それが「米国%」です。もう片方はデフォルトのテーブルスキャンにしかなりませんが、最初の部分が成功すれば実行されません – Jaguar

+0

これはバグであることを確認したのでこれをマークします。私は何かシンプルなものを見逃していたと思っていたが、私はそうは思わない! 3文字のトークンを持つ3文字のフィールドでLikeを行うのは、通常は無意味だと私は同意します。しかし、私の特別なケースでは、ユーザーには高度なフィルタリングオプションが提示されます。彼らは "等"または "好き"を選択することができ、したがって3文字を入力する可能性があります。 – SkipHarris

関連する問題