7

次のSQLをNHibernateに変換しようとしています。

SELECT * FROM dbo.Customer
WHERE FirstName + ' ' + LastName LIKE '%' + 'bob smith' + '%'

私はこのようなことをしようとしていましたが、機能していません:

name = "%" + name + "%";

var customers = _session.QueryOver<Customer>()
            .Where(NHibernate.Criterion.Restrictions.On<Customer>(c => c.FirstName + ' ' + c.LastName).IsLike(name))
            .List();

私が基本的にやろうとしているのは、「bob smith」の値の例を使用してテキストボックスで顧客の名前を検索し、上記のSQLのLIKE式を使用してデータベースを検索できるようにすることです。

FirstName列とLastName列を間違って検索する場合は、別の方法を教えてください。ただし、上記のSQLクエリで必要なものが得られます。

2つのソリューションで更新:

だから私は今、この問題に対する2つの解決策を見つけました。1つは、CriteriaAPIを使用することです。次の投稿には、うまく機能する答えがあります:https ://stackoverflow.com/a/2937100/670028

私が見つけたもう1つの解決策は、LINQプロジェクションと匿名型の使用を提案してくれた親切な同僚の1人に感謝します。LINQを使用したソリューションは次のとおりです。

var customers = session.Query<Customer>()
    .Select( x => new { FullName = x.FirstName + " " + x.LastName, Customer = x } )
    .Where( x => x.FullName.Contains( "Bob Smith" ) )
    .Select( x => x.Customer )
    .ToList();
4

4 に答える 4

11

NHibernate は、c => c.FirstName + ' ' + c.LastName の処理方法がわからないため、式を sql ステートメントに変換できません。解決策は、これを次のように書き換えることです。

Session.CreateCriteria<Customer>()
    .Add(Restrictions.Like(
    Projections.SqlFunction("concat",
                            NHibernateUtil.String,
                            Projections.Property("FirstName"),
                            Projections.Constant(" "),
                            Projections.Property("LastName")),
    "Bob Whiley",
    MatchMode.Anywhere))
于 2011-07-15T18:37:37.897 に答える
1

コードを可能な限り強く型付けしたい場合は、次の方法でそれを実現しました。Disjunction で使用する必要がありました。これが誰かを助けることを願っています!

var disjunction = new Disjunction();
var fullNameProjection = Projections.SqlFunction(
    "concat",
    NHibernateUtil.String,
    Projections.Property<UserProfile>(x => x.FirstName),
    Projections.Constant(" "),
    Projections.Property<UserProfile>(x => x.LastName)
    );
var fullNameRestriction = Restrictions.Like(fullNameProjection, searchText, MatchMode.Anywhere);
disjunction.Add(fullNameRestriction);
于 2013-02-20T16:56:55.270 に答える
0

私はそれが次のようになると思います:

.On(c => c.IsLike(c.FirstName + ' ' + c.LastName))

現在のように正しい値を比較していないためです。

于 2011-07-15T15:51:08.007 に答える
0

私はこれを試すことができます:

query.Where(Restrictions.On<MyType>(x => x.Field).IsLike(StringToSearch))

QueryOver または Criteria API では複雑すぎる場合は、HQL 構文を使用できます

于 2011-07-15T17:10:09.240 に答える