NHibernate Likeと整数

case-insensitive int like nhibernate
NHibernate Likeと整数

私は整数を受け取り、少なくとも先頭が整数と一致する結果を返したいNHibernate検索関数を持っています、例えば

受信した整数:729 +戻り値:729445、7291など。

データベース列はint型で、Fooのプロパティ「Id」も同様です。

But

int id = 729;

var criteria = session.CreateCriteria(typeof(Foo))

criteria.Add(NHibernate.Criterion.Expression.InsensitiveLike("Id", id.ToString() + "%"));

return criteria.List();

エラーになります(パラメーター文字列をint32に変換できませんでした)。 コード、回避策、またはその他の解決策に何か問題がありますか?

  2  0


ベストアンサー

これはどう:

int id = 729;

var criteria = session.CreateCriteria(typeof(Foo))
criteria.Add(Expression.Like(Projections.Cast(NHibernateUtil.String, Projections.Property("Id")), id.ToString(), MatchMode.Anywhere));

return criteria.List();

7


私の知る限り、組み込みのNHibernate機能を使用したい場合は、データベースに整数を文字列として保存する必要があります(NHibernateがなくてもこのアプローチをお勧めします-あなたが扱っている「いいね」の検索を始めた瞬間数字ではなく文字列で-米国の郵便番号などを考えてください)。

データベース固有の関数で数学的に行うこともできます(またはhttps://stackoverflow.com/questions/5937492/nhibernate-like-with-integer/5938978#5938978[Thiago Azevedo’s answer]で説明されているように文字列に変換します) 、しかし、これらのオプションはかなり遅くなり、特定のデータベースに結びつく可能性もあると思います。

3


このようなことを試しましたか?

int id = 729;

var criteria = session.CreateCriteria(typeof(Foo))

criteria.Add(NHibernate.Criterion.Expression.Like(Projections.SqlFunction("to_char", NHibernate.NHibernateUtil.String, Projections.Property("Id")), id.ToString() + "%"));

return criteria.List();

アイデアは、to_char関数を使用する前に列を変換することです。 一部のデータベースはこれを自動的に行います。

3


タイトルとURLをコピーしました