c# - 从 DbDataReader 读取/序列化时避免代码重复?

标签 c# design-patterns lambda dbdatareader

考虑下面的FetchData方法。它旨在避免每次要从数据库获取某些数据时重复数据库查询代码。

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);
                }
            }
        }
    }
}

最佳答案

也许使用泛型?

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();

关于c# - 从 DbDataReader 读取/序列化时避免代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424241/

相关文章:

c# - 如何使用 SharpZipLib 提取或访问 gzip 中特定文件的流?

design-patterns - 任何复杂逻辑的设计模式/编码方法?

c# - Linq 表达式 : Create a max query using a generic DbSet

c# - DAO 只负责 CRUD 操作?

java - 通过静态标识符从数据库接收数据(Java 中的示例)

c# - 为什么 VB 中的 lambda 表达式与 C# 中的不同?

c# - 通过反射创建 Expression<Func<T, object>> 变量

c# - 存储许可证详细信息

c# - 套接字发送null的长字符串

c# - 如果它为空,则不要添加到列表中 c#