http://ayende.com/blog/2376/converting-an-object-collection-to-a-dataset
http://abombss.com/blog/2007/05/09/nhibernate-to-dataset/
你的问题不是新问题。基本上,通常的解决方案是从 NHibernate 获取信息作为域对象的集合,然后使用这些对象的属性手动构建 DataTable。
您还可以在 NHibernate 上添加一点香草 ADO。NHibernate ITransactions 有一个 Enlist() 方法,它基本上允许您在 NHibernate 实现的内部将一个普通的 ADO DbCommand 关联到 ADO DbTransaction 方法,并像不使用 NHibernate 时一样执行它,以获得结果ADO.NET 格式。这是我放入 Repository 实现的内容,允许我按名称调用遗留存储过程:
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 对象是链接到 Session 及其 Transaction 的令牌,用于控制它们的范围和生命周期;您可以修改它以使用您拥有的任何会话处理机制(包括从 SessionFactory 仅为此命令创建一个新的 Session,如果您选择)。你也可以传入“裸”的 SQL 字符串来执行;我通常会避免这种情况(事实上,实际实现中存储过程的名称是在特定静态类型的常量实例后面抽象出来的,类似于枚举)。