我已經知道我們如何使用NHibernate調用存儲過程並填充DTO(如回答here)。是否有可能使用NHibernate調用存儲過程並填充DataTable?
但是,我想知道是否有可能以某種方式填充DataTable在NHibernate中使用ResultTransformer的相同概念還是有任何其他推薦的方法?
我更喜歡在NHibernate中使用ResultTransformer的概念。但是,我不知道它是否可行以及如何。有沒有其他人試過這個?
我已經知道我們如何使用NHibernate調用存儲過程並填充DTO(如回答here)。是否有可能使用NHibernate調用存儲過程並填充DataTable?
但是,我想知道是否有可能以某種方式填充DataTable在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方法。該元組包含數據,其中別名包含數據的名稱。所以,我們幾乎可以構建並填充我們的DataTable。一旦結果集的所有項目都已通過TransformTupple方法進行轉換,則在最後調用TransformList方法。 collection參數包含我們在TransformTupple方法中轉換爲DataRow的所有項目。所以,在這裏我們可以很容易地用DataRows填充我們的DataTable並返回。
希望它有助於其他人處理同一種情況。
警告:當表格爲空時,這不起作用。 – 2017-08-28 10:20:01
看來有人試過它取得了一些成功:-) http://www.codewrecks.com/blog/index.php/2010/10/07/load-a-strongly-typed-dataset-from-a-用-nhibernate存儲/ – jbl 2013-02-27 08:36:43
@jbl,+1作爲參考,我已經使用了這個概念並將解決方案作爲答案:-)。請看看它。 – Baig 2013-02-27 10:31:20
在這種情況下,NHibernate只是噪音。只需從中獲得連接(如果需要)並使用DataAdapter。 – 2013-02-27 15:52:14