2012-01-04 114 views
1

我有一個非常簡單的問題,但找不到一個簡單的答案。單列結果NHibernate SQL查詢映射

我有NHibernate的執行原始SQL查詢,不幸被從數據庫中加載(是的,我們存儲SQL查詢的數據庫,沒有最好的設計,但我承擔)。這意味着基本上我不知道查詢將返回多少列。 我知道的是,如果查詢是單個列,那麼它是我需要的,如果它是多個列,那麼我需要第一個列,很簡單。

在我的代碼基本上有3種選擇:

session.CreateSQLQuery(SQLString).List(); 
session.CreateSQLQuery(SQLString).List<object>(); 
session.CreateSQLQuery(SQLString).List<object[]>(); 

問題是列表()將返回一個List<int>(或合適的類型,但INT應該是在我的情況),如果該查詢返回單列,或者如果我有多個列,則爲List<object[]>()。在這種情況下,List<object>除外不會返回List<int>。 當然,試圖總是強制轉換爲object [](第三選項)並獲取第一個元素不起作用,因爲nHibernate返回一個int並且不能轉換爲object []。

有沒有辦法強制NHibernate的始終,即使在一列的情況下返回一個對象[]?如果沒有,是否有一種簡單的方法來檢查結果中的列數,並據此採取行動?

謝謝!

+0

可能NHibernate的DTO將滿足您的需要。列表除外 Anand 2012-01-04 13:39:58

+0

如果您不知道您的查詢將返回什麼內容,那麼您如何知道如何處理結果,或者您是否通過結果的形式決定? – 2012-01-04 14:10:38

+0

我知道我需要一個int(ID基本上)的列表。如果查詢返回1列,這將是我所需要的,但如果它返回多個列,第一列將是我所需要的。然後我通過這個ID列表進行處理... 我不知道結果的類型,因爲查詢是由其他進程動態生成的(它基本上是一種動態過濾形式)。 – Tallmaris 2012-01-04 14:56:02

回答

3

你應該看看歧結果變壓器的NHibernate提供開箱即用的(你可以編寫自己也當然)。

可能適合你的情況會是什麼NHibernate.Transform.ToListResultTransformer。 AFAIK,它將您的結果轉換爲IList,每個條目再次包含一個IList。

所以:

IList items = session 
.CreateSQLQuery(query) 
.SetResultTransformer(new NHibernate.Transform.ToListResultTransformer()) 
.List() 

if(((Ilist)items[0]).Count == 1) 
// just one columns 
else 
// more columns or zero 
+0

究竟需要什麼,我實際上正在考慮寫我自己的,但很高興知道有一個預先包裝的。謝謝! – Tallmaris 2012-01-04 16:29:43