2012-09-14 24 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