2012-01-04 7 views
1

私は非常に簡単な質問がありますが、簡単な答えは見つかりません。シングルカラムのNHibernate SQLクエリマッピング結果:

残念なことにDBからロードされた生のSQLクエリを実行するNHibernateを持っています(はい、私はDBにSQLクエリを格納しますが、最高のデザインではありませんが、私には負担してください)。つまり、基本的にクエリが返す列の数はわかりません。 私が知っているのは、クエリが単一の列であれば、それは必要なものであり、それが複数の列であれば、最初の列が必要なだけで十分です。私のコードで

私は基本的に3つのオプションがあります。

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

問題は、リストは()のいずれかを返すということですList<int>(または適切な型が、int型は、私の場合でなければなりません)クエリが返す場合単一の列、または複数の列を持つ場合はList<object[]>()です。この場合はList<int>が返されない点を除いて、List<object>の場合も同じです。 もちろん、常にオブジェクト[](第3オプション)にキャストして最初の要素を取得しようとしないと、nHibernateがintを返し、オブジェクト[]にキャストできないため動作しません。

単一の列の場合でも常にnHibernateがオブジェクト[]を返すように強制する方法はありますか?そうでない場合は、結果の列の数を確認してそれに応じて簡単に方法がありますか?

ありがとうございます!

+0

おそらく、NHibernateのDTOがあなたのニーズを満たすことになります。リストを除き Anand

+0

あなたのクエリが返すものがわからない場合は、どのように結果をどうするかを知っていますか、結果の形状によって決定しますか? –

+0

私はint(IDは基本的に)のリストが必要であることを知っています。クエリが1列を返す場合は必要なものになりますが、複数の列が返された場合は最初の列が必要になります。私はその後、このIDのリストを処理するために渡します... クエリは他のプロセスによって動的に生成されるため、結果のタイプはわかりません(基本的には動的フィルタリングの一種です)。 – Tallmaris

答えて

3

NHibernateが提供する異なる結果のトランスフォーマーを見てみるべきです(あなた自身でももちろん書くことができます)。

あなたのケースに合うものはNHibernate.Transform.ToListResultTransformerです。 AFAIKを使用すると、結果がIListに変換されます。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