gpt4 book ai didi

nhibernate - 是否可以使用 NHibernate 调用存储过程并填充数据表?

转载 作者:行者123 更新时间:2023-12-05 01:23:10 24 4
gpt4 key购买 nike

我已经知道我们如何使用 NHibernate 调用存储过程并填充 DTO(如回答 here )。

但是,我想知道是否可以使用 NHibernate 中相同的 ResultTransformer 概念以某种方式填充数据表,或者是否有任何其他推荐的方法?

我更喜欢在 NHibernate 中使用 ResultTransformer 的概念。但是,我不知道它是否可能以及如何。有没有其他人试过这个?

最佳答案

我使用 ResultTransformer 的概念提出了以下解决方案 here :

  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 方法。元组包含数据,其中别名包含数据的名称。因此,我们几乎拥有构建和填充数据表的所有内容。一旦结果集的所有项都已通过 TransformTupple 方法进行转换,则最后调用 TransformList 方法。 collection 参数包含我们在 TransformTupple 方法中转换为 DataRow 的所有项目。因此,在这里我们可以轻松地用 DataRow 填充我们的 DataTable 并返回。

希望它对处理相同场景的其他人有所帮助。

关于nhibernate - 是否可以使用 NHibernate 调用存储过程并填充数据表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15105897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com