我已经知道如何使用NHibernate调用存储过程并填充DTO(如here所述)。
但是,我想知道是否有可能以某种方式在NHibernate中使用相同的ResultTransformer概念填充DataTable,还是有其他推荐的方法?
我更喜欢在NHibernate中使用ResultTransformer的概念。但是,我不知道它是否可能以及如何。还有其他人试过吗?
答案 0 :(得分:7)
我使用描述here:
的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));
}
}
}
并使用如下:
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();
}
我刚刚创建了一个自定义的ResultTransformer,并在我的sql查询中使用它来根据我在DataTableResultTransformer中的逻辑转换查询结果。
为结果集中的每个项调用TransformTupple方法。元组包含数据,其中别名包含数据的名称。因此,我们几乎可以构建和填充DataTable。一旦通过TransformTupple方法转换了结果集的所有项,则最后调用TransformList方法。 collection参数包含我们在TransformTupple方法中转换为DataRow的所有项。所以,在这里我们可以使用DataRows轻松填充DataTable并返回。
希望它对处理同类情景的其他人有所帮助。