2016-05-13 13 views
1

長い時間のリスナー、初めての呼び出し元。queryover - 同一の離接で参照のプロパティとプロパティを持つQueryOver

私は、自分のエンティティの特定のプロパティにわたっていくつかの用語を検索するQueryOver APIを使用してクエリを作成しようとしています。問題は、それらのプロパティのいくつかが別のエンティティへの参照であることです。しかし、私はまだその参照のプロパティで指定された用語を検索する必要があります。

私は以下のようなコードを書くことができます。以下のコードでは、FirstName、MiddleName、およびLastNameはすべてPersonエンティティの基本的な文字列プロパティです。 DepartmentプロパティはDepartmentタイプの参照プロパティです。 Departmentエンティティには、Id、Value、Descriptionという3つのプロパティがあります。 Person.Department.Valueであり、基本プロパティと共に指定された用語を検索する必要があります。

var queryOver = session.QueryOver<Person>(); 
foreach (string term in searchTerms) 
{ 
    queryOver = queryOver.Where(Restrictions.On<Person>(x => x.FirstName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        Restrictions.On<Person>(x => x.LastName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        Restrictions.On<Person>(x => x.MiddleName).IsInsensitiveLike(term, MatchMode.Anywhere) || 
        //This following line doesn't work. 
        Restrictions.On<Person>(x => x.Department.Value).IsInsensitiveLike(term, MatchMode.Anywhere) 
} 

エイリアスを使用し、NHibernate.Linq/Query APIを使用しようとしました。エイリアスを使用して何らかの参加をする必要があることは分かっていますが、私が読んだすべての質問/記事を理解していないと思います。それらのほとんどは、参照または子に対してクエリ/サブクエリを行うことについて話しているようですが、これらのクエリを他のプロパティの横にあるクエリに変換し、それらをすべてOR処理することに問題があります。

私が撮影してる最終SQLは次のようなものです:最後に

SELECT * 
FROM `persons` 
WHERE (`FirstName` LIKE '%term1%' OR 
     `LastName` LIKE '%term1%' OR 
     `MiddleName` LIKE '%term1%' OR 
     `Department`.`Value` LIKE '%term1%') AND //I know this won't work 
     (`FirstName` LIKE '%term2%' OR 
     `LastName` LIKE '%term2%' OR 
     `MiddleName` LIKE '%term2%' OR 
     `Department`.`Value` LIKE '%term2%') AND etc... 

、任意の助けを事前にどうもありがとうございました。私はNHibernate内で別のAPIを使用したり、別の検索結果で同じ結果を得ることができると思われる場合は別の検索方法を使用しています。

答えて

0

申し訳ありませんが、やっと私はそれを理解しました。正しい方向に私を指しているため、これらの記事のおかげ:

QueryOver Or with Subquery

Filtering and projecting an association using NHibernate QueryOver

ここで私は私が必要なものを行うために思い付いたコードです。ランダム変数をnullに設定した醜いエイリアスを使用することは本当にありませんでした。また、他の場所で定義された一連の異なるクエリを持つことも望んでいませんでした。誰かがそれを必要とすれば、私はさらに説明することができます。

var persons = session.QueryOver<Person>() 
       .Where(Restrictions.Disjunction() 
        .Add(Subqueries.WhereProperty<Person>(x => x.Department.Id).In(QueryOver.Of<Department>().WhereRestrictionOn(x => x.Value).IsInsensitiveLike("somedep", MatchMode.Anywhere).Select(x => x.Id))) 
        .Add<Person>(x => x.LastName.IsInsensitiveLike("somedep", MatchMode.Anywhere))) 
       .Where(Restrictions.Disjunction() 
        .Add(Subqueries.WhereProperty<Person>(x => x.Department.Id).In(QueryOver.Of<Department>().WhereRestrictionOn(x => x.Value).IsInsensitiveLike("myname", MatchMode.Anywhere).Select(x => x.Id))) 
        .Add<Person>(x => x.LastName.IsInsensitiveLike("myname", MatchMode.Anywhere)))) 
       .List(); 
関連する問題