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

Bai*_*aig 3 nhibernate datatable stored-procedures

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

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

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

Bai*_*aig 7

我使用这里描述的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并返回.

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