c# - 如何正确地将 DataReader 转换为 DTO/List<DTO>?

标签 c# .net .net-4.5 datareader

<分区>

我正在尝试找到一种将 DataReader 转换为 DTO 的简单方法(具有与列名一样的属性)。但我想知道反射会如何影响性能,也许有更简单/更清洁的方法来做到这一点。

我一直在寻找 SO 但没有找到合适的解决方案(即使是重复的问题)。

这是我做的“作业”

 public static T ConvertSPToDTO<T>(string procName, List<SqlParameter> parameters) where T : new()
    {
        T t = new T();
        SqlDataReader rs = null;
        try
        {
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(procName, conn))
                {
                    foreach (SqlParameter param in parameters)
                    {
                        cmd.Parameters.Add(param);
                    }
                    cmd.CommandType = CommandType.StoredProcedure;
                    rs = cmd.ExecuteReader();
                    List<string> columns = Enumerable.Range(0, rs.FieldCount).Select(rs.GetName).ToList();
                    while (rs.Read())
                    {
                        foreach (string column in columns)
                        {
                            if (rs[column] != System.DBNull.Value)
                            {
                                t.GetType().GetProperty(column).SetValue(t, Convert.ChangeType(rs[column], rs[column].GetType()), null);
                            }

                        }
                    }
                    rs.Close();
                    return t;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return default(T);
        }
        finally
        {
            rs.Dispose();
        }
    }

最佳答案

要有效地做到这一点,需要元编程。您可以使用图书馆来提供帮助。例如,“FastMember”包括一个 TypeAccessor,它提供对实例创建的快速访问和按名称的成员访问。然而,这个例子基本上也正是“dapper”的工作方式,所以你可以使用dapper:

int id = ...
var data = connection.Query<Order>(
    "select * from Orders where CustomerId = @id",
    new { id }).ToList();

你也可以打开“dapper”代码看看它做了什么。

关于c# - 如何正确地将 DataReader 转换为 DTO/List<DTO>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18930094/

相关文章:

c# - 使用linq从输入文件中反转文本

.net 动态刷新 app.config

c# - .Net 的鼠标手势库?

c# - 从 ObjectContext 转换为 DBContext

c# - WrapPanel 为每个动态扩展控件创建一个新列

c# - Selenium Webdriver/C# - 如何在点击后确认页面加载?

c# - 如何在 Xamarin.forms 的轮播页面中以编程方式更改页面?

c# - 当我尝试压缩不同级别的 pdf 文件时,ITextSharp 返回相同大小的 pdf

c# - 是否可以检查谁连接到您的无线网络?

c# - MVC4 .NET 4.5 异步操作方法不重定向