Bai*_*aig 3 nhibernate datatable stored-procedures
我已经知道如何使用NHibernate调用存储过程并填充DTO(如此处所述).
但是,我想知道是否有可能以某种方式使用NHibernate中的ResultTransformer的相同概念来填充DataTable,还是有任何其他推荐的方法?
我更喜欢在NHibernate中使用ResultTransformer的概念.但是,我不知道它是否可能以及如何.有没有人试过这个?
我使用这里描述的ResultTransformer的概念提出了以下解决方案:
public class DataTableResultTransformer : IResultTransformer
{
private DataTable dataTable;
public IList TransformList(IList collection)
{
var rows = collection.Cast<DataRow>().ToList();
rows.ForEach(dataRow => dataTable.Rows.Add(dataRow));
return new List<DataTable> { dataTable };
}
public object TransformTuple(object[] tuple, string[] aliases)
{
//Create the table schema based on aliases if its not already done
CreateDataTable(aliases);
//Create and Fill DataRow
return FillDataRow(tuple, aliases);
}
private DataRow FillDataRow(object[] tuple, string[] aliases)
{
DataRow dataRow = dataTable.NewRow();
aliases.ToList().ForEach(alias =>
{
dataRow[alias] = tuple[Array.FindIndex(aliases, colName => colName == alias)];
});
return dataRow;
}
private void CreateDataTable(IEnumerable<string> aliases)
{
if (dataTable == null)
{
dataTable = new DataTable();
aliases.ToList().ForEach(alias => dataTable.Columns.Add(alias));
}
}
}
Run Code Online (Sandbox Code Playgroud)
并使用如下:
using (ISession session = sessionFactory.OpenSession())
{
var sqlQuery = session.CreateSQLQuery("SELECT ID, NAME, ADDRESS FROM CUSTOMER");
var transformedQuery = sqlQuery.SetResultTransformer(new DataTableResultTransformer());
return transformedQuery.List().Single();
}
Run Code Online (Sandbox Code Playgroud)
我刚刚创建了一个自定义的ResultTransformer,并在我的sql查询中使用它来根据我在DataTableResultTransformer中的逻辑转换查询结果.
为结果集中的每个项调用TransformTupple方法.元组包含数据,其中别名包含数据的名称.因此,我们几乎可以构建和填充DataTable.一旦通过TransformTupple方法转换了结果集的所有项,则最后调用TransformList方法.collection参数包含我们在TransformTupple方法中转换为DataRow的所有项.所以,在这里我们可以使用DataRows轻松填充DataTable并返回.
希望它对处理同类情景的其他人有所帮助.
| 归档时间: |
|
| 查看次数: |
5089 次 |
| 最近记录: |