2011-12-21 58 views
0

聯盟與NHibernate和標準:與NHibernate和標準聯盟?

是否有可能在標準或QueryOver? 如果沒有,是否有其他方法可以在同一查詢中實現兩個結果的並集?

回答

6

你不能直接做一個工會,但你可以做兩次日後的查詢和工會的結果代碼:

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

在此之後,當任一結果集是列舉,NHibernate的會發出一個查詢到將返回多個結果集的數據庫。請注意,如果您不使用SQL Server,則數據庫可能不支持多個結果集。

+0

我會嘗試一下。謝謝 – Mattias 2011-12-22 08:28:17

+0

這對我的情況最有效。謝謝! – Mattias 2011-12-22 11:46:38

6

即使使用HQL,這也是不可能的。看到這個其他S.O. post

一種方式是回落到原始的SQL,並使用一個命名查詢

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

,並使用AliasToBeanResultTransformer改造它放回你的DTO/POCO

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

不幸的是這不是一個選項,因爲列可以變化。感謝您的提示,但! +1 – Mattias 2011-12-21 20:23:26

3

您可以使用 -

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

作爲您的標準在一個單一的查詢。

+0

我會在早上嘗試這個,回覆你 – Mattias 2011-12-21 20:23:40

+0

這也適用,但由於我做了基本類和交叉表的OR-條款,我加入(我應該在問題中解釋) ,由此產生的查詢會導致顯着的性能損失。但感謝您的答案。 +1 – Mattias 2011-12-22 11:49:51