2017-08-07 5 views
0

私は、Levenshtein検索距離計算を使用してデータベースから結果をフィルタリングする投影を作成しようとしています。より小さいか等しいとNHibernateカスタム投影

... 
return session.CreateCriteria<Contact>() 
       .Add(Expression.Le(Levenshtein("FullName", "Bob"), 5) 
... 
投影クラスの新しいインスタンスを返すために小さなヘルパーメソッドを作成し

public static LevenshteinProjection Levenshtein(string propertyName, string searchValue) 
{ 
    return new LevenshteinProjection(propertyName, searchValue); 
} 

基本的にすべての作品:この私はDBへのセッションを開き、データベースを照会するためにCreateCriteriaを使用を作成するにはテキストをコンパイルする文字列を作成するときには問題ありませんが、生成されるSQLを見て、それ以下の値にしたい値は?です!

... {rest of sql select} WHERE levenshtein(this_.full_name, 'Bob') <= ? 

なぜそれが追加されますか?私は

public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuery) 
{ 
    return new IType[] { NHibernateUtil.Int32 }; 
} 

おかげ

答えて

0

に戻り値の型を設定していますか?パラメータのプレースホルダーを表します。

NHibernateは 'パラメータ化されたクエリ'を生成します。パラメータ値がハードコードされたクエリを作成する代わりに、パラメータを含むクエリを生成します。 パラメータには、指定した値が割り当てられます。

これにより、DBMSはクエリ実行計画をキャッシュできます。

+0

この場合、データをフィルタリングしないのはなぜですか? – Matt

+0

気にしないで、私は愚かですが、これを調べることで、パラメータとしてlevenshtienの2番目の値を追加して、SQLを改善しました。実際に渡されたパラメータを示す接続文字列にShowSqlを使用しました(SQLを実行すると同じ結果が得られました)。 – Matt

+0

また、私は違いを学ぶ必要があります<= and > = *失望の机の上に頭を打つ* – Matt

関連する問題