2013-02-27 74 views
3

我已經知道我們如何使用NHibernate調用存儲過程並填充DTO(如回答here)。是否有可能使用NHibernate調用存儲過程並填充DataTable?

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

我更喜歡在NHibernate中使用ResultTransformer的概念。但是,我不知道它是否可行以及如何。有沒有其他人試過這個?

+1

看來有人試過它取得了一些成功:-) 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

+0

@jbl,+1作爲參考,我已經使用了這個概念並將解決方案作爲答案:-)。請看看它。 – Baig 2013-02-27 10:31:20

+0

在這種情況下,NHibernate只是噪音。只需從中獲得連接(如果需要)並使用DataAdapter。 – 2013-02-27 15:52:14

回答

5

我想出了利用使用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並返回。

希望它有助於其他人處理同一種情況。

+0

警告:當表格爲空時,這不起作用。 – 2017-08-28 10:20:01

相關問題