2011-12-21 23 views
0

NHibernateとの結合条件と基準:NHibernateとCriteriaとの統合?

CriteriaまたはQueryOverで可能ですか? そうでない場合は、同じクエリ内で2つの結果の和集合を得る他の方法はありますか?

答えて

6

:この後

var resultSet1 = this.Session.CreateCriteria<A>().Future<A>(); 
var resultSet2 = this.Session.CreateCriteria<B>().Future<B>(); 

を、どちらかの結果セットが列挙されている場合、NHibernateは1つのクエリを発行します複数の結果セットを返すデータベースに渡します。 SQL Serverを使用していない場合は、データベースが複数の結果セットをサポートしていない可能性があります。

+0

私はそれを試してみます。ありがとう – Mattias

+0

これは私の状況に最適です。ありがとう! – Mattias

6

これは、HQLを使用しても実行できません。この他のS.O. post

一つの方法は、生のSQLに戻ってドロップすると、名前付きクエリ

<sql-query name="MyQuery"> 
<![CDATA[ 
select col1,col2 from table1 
union 
select col1,colA from table2 
]]> 
</sql-query> 

を使用して、/ POCO

var query = Session 
    .GetNamedQuery("MyQuery") 
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(MyDto))); 
    return query.List<MyDto>(); 
+0

この列は異なる可能性があるため、残念ながらオプションではありません。しかし、ヒントをありがとう! +1 – Mattias

3

あなたが使用することができ、あなたのDTOに戻ってそれを変換するためにAliasToBeanResultTransformerを使用することです -

NHibernate.Criterion.Restrictions.Or(ICriterion FirstQuery, 
            ICriterion SecondQuery) 

を1つのクエリで指定します。

あなたが直接労働組合を行うことはできませんが、2つの将来のクエリと労働組合のコードで結果行うことができます
+0

私は朝にこれを試してみると – Mattias

+0

これも動作しますが、基本クラスとクロステーブルを使ってOR節を作っているので(これは質問で説明しておくべきです)結果として得られるクエリは、大幅なパフォーマンスの低下を招く。しかし、答えをありがとう。 +1 – Mattias