是否可以使用NHibernate调用存储过程并填充DataTable?

时间:2013-02-27 06:52:03

标签: nhibernate stored-procedures datatable

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

但是,我想知道是否有可能以某种方式在NHibernate中使用相同的ResultTransformer概念填充DataTable,还是有其他推荐的方法?

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

1 个答案:

答案 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并返回。

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