http://ayende.com/blog/2376/converting-an-object-collection-to-a-dataset
http://abombss.com/blog/2007/05/09/nhibernate-to-dataset/
あなたの問題は新しい問題ではありません。基本的に、通常の解決策は、ドメインオブジェクトのコレクションとしてNHibernateから情報を取得し、それらのオブジェクトのプロパティを使用して手動でDataTableを構築することです。
小さなバニラADOをNHibernateにボルトで固定することもできます。NHibernate ITransactionsにはEnlist()メソッドがあり、基本的に、プレーンなol ADODbCommandをNHibernateの実装の内部にあるADODbTransactionに関連付け、NHibernateを使用していない場合と同じように実行して結果を取得できます。 ADO.NET形式。これが私がリポジトリの実装に入れたもので、名前でレガシーストアドプロシージャを呼び出すことができます。
public IDataReader ExecuteReaderStoredProcedure(string procName, IUnitOfWork uow, IEnumerable<KeyValuePair<string, object>> parameters)
{
var command = Sessions[uow].Connection.CreateCommand();
command.CommandText = procName;
command.CommandType = CommandType.StoredProcedure;
foreach (var param in parameters)
{
var parameter = command.CreateParameter();
parameter.ParameterName = param.Key;
parameter.Value = param.Value;
command.Parameters.Add(parameter);
}
Sessions[uow].Transaction.Enlist(command);
return command.ExecuteReader();
}
その後、DataReaderを使用してDataTable/DataSetにデータを入力できます。
いくつかのメモ; 表示されるIUnitOfWorkオブジェクトは、セッションとそのトランザクションにリンクするトークンであり、それらのスコープと存続期間を制御するために使用されます。これを変更して、使用しているセッション処理メカニズムを使用できます(必要に応じて、このコマンド専用にSessionFactoryから新しいセッションを作成することも含まれます)。「裸の」SQL文字列を渡して実行することもできます。私は通常これを避けます(実際、実際の実装でストアドプロシージャの名前は、列挙型と同様に、特定の静的タイプの定数インスタンスの背後に抽象化されています)。