3

2つのプロパティの組み合わせを使用して、結果のリストをフィルタリングする必要がありました。単純なSQLステートメントは次のようになります。

SELECT TOP 10 *
FROM Person
WHERE FirstName + ' ' + LastName LIKE '%' + @Term + '%'

私が最終的に使用したNHibernateのICriteriaは次のとおりです。

ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Sql(
    "FirstName + ' ' + LastName LIKE ?",
    "%" + term + "%",
    NHibernateUtil.String));
criteria.SetMaxResults(10);

それは完璧に機能しますが、NHibernateのCriteria APIについてまだ学んでいるので、それが理想的なソリューションであるかどうかはわかりません。推奨される代替案は何ですか?

  • それ以外Expression.Sqlに同じ操作を実行するものはありますか?試しExpression.Likeましたが、名前と名前を組み合わせる方法がわかりませんでした。
  • FullNameプロパティをマッピングクラスの式"FirstName+'' + LastName"にマップする必要がありますか?
  • ドメインオブジェクトに読み取り専用のFullNameプロパティを作成してから、それを列にマップする必要がありますか?
4

2 に答える 2

13

次のいずれかを実行できます。

  • 常にフルネームで作業する場合は、単一のプロパティを持つのがおそらく最善です
  • その目的のためにクエリ専用プロパティを作成します(http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspxを参照)
  • 自由形式のクエリに適したHQLでクエリを実行します(おそらくSQLとほぼ同じです)
  • 適切なエンティティベースの基準を使用します。

Session.CreateCriteria<Person>()
       .Add(Restrictions.Like(
            Projections.SqlFunction("concat",
                                    NHibernateUtil.String,
                                    Projections.Property("FirstName"),
                                    Projections.Constant(" "),
                                    Projections.Property("LastName")),
            term,
            MatchMode.Anywhere))
于 2010-05-30T00:37:31.670 に答える
0

純粋な技術面では答えはありませんが、これを考慮してください。ユーザーが用語を入力するための入力フィールドは1つしかないため、ユーザーが「foobar」または「foobar」を入力するかどうかはわかりません。 'bar foo' ...だから私はこれをお勧めします:

ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Like("FirstName",term, MatchMode.Anywhere) || Expression.Like("LastName",term, MatchMode.Anywhere));
criteria.SetMaxResults(10);
于 2010-05-29T22:29:52.323 に答える