2012-09-14 47 views
2

考慮下面的FetchData方法。它旨在避免每次要從數據庫獲取一些數據時都複製數據庫查詢代碼。從DbDataReader讀取/序列化時避免代碼複製?

List<MyData> myData = new List<MyData(); 
FetchData((IDataReader reader) => 
    { 
     myData.Add(new MyData(reader.GetString(0), reader.GetInt32(1))); 
    }, "usp_get_my_data"); 

它的工作原理,但它會很好,如果這個對象的創建可以以某種方式生活的FetchData方法內。

有沒有更好的方法?

也許FetchData可以進行修改,以直接返回某種類型X的名單?

protected void FetchData(Action<IDataReader> processor, String query) 
{ 
    using (var connection = CreateConnection()) 
    { 
     connection.ConnectionString = ConnectionString; 
     connection.Open(); 

     using (var command = connection.CreateCommand()) 
     { 
      command.CommandType = CommandType.StoredProcedure; 
      command.CommandText = query; 

      using (IDataReader reader = command.ExecuteReader()) 
      { 
       while (reader.read()) 
       { 
        processor(reader); 
       } 
      } 
     } 
    } 
} 
+0

的問題將是FetchData需要到現在的,這將是創造實現這一目的的東西。爲什麼不使用某種類型的接口將對象創建作爲實際對象的一部分(在這種情況下爲MyData),並將其傳遞給FetchData。 –

+0

你的意思是像工廠?還有一個允許使用不同數據類型的模板? – l33t

+0

傳遞給FetchData的處理器Action應該存在於MyData onbject中。 –

回答

2

使用泛型可能嗎?

protected IEnumerable<T> FetchData<T>(Func<IDataReader, T> processor, String query) 
{ 
    using (var connection = CreateConnection()) 
    { 
     connection.ConnectionString = ConnectionString; 
     connection.Open(); 

     using (var command = connection.CreateCommand()) 
     { 
      command.CommandType = CommandType.StoredProcedure; 
      command.CommandText = query; 

      using (IDataReader reader = command.ExecuteReader()) 
      { 
       while (reader.read()) 
       { 
        yield return processor(reader); 
       } 
      } 
     } 
    } 
} 

然後你可以使用枚舉,但是你想:

var myData = FetchData<MyData>(reader => new MyData(reader.GetString(0), reader.GetInt32(1)), "usp_get_my_data").ToList(); 
+0

絕對精彩!謝謝。 – l33t

1

你可能會在Dapper.Net看一看這三個不同的助手單個文件ORM:

  1. 執行查詢並將結果以一個強類型列表
  2. 映射執行查詢,並將其映射到動態對象
  3. 的列表
  4. 執行不返回結果的命令

用於構建此miro-ORM的設計模式非常有用。 Dapper.Net is currently being used in StackOverflow

+0

有趣!將在未來的實現中考慮這一點! – l33t