如何正确地将 DataReader 转换为 DTO/List<DTO>? [复制]
Posted
技术标签:
【中文标题】如何正确地将 DataReader 转换为 DTO/List<DTO>? [复制]【英文标题】:How to convert a DataReader to a DTO/List<DTO> properly? [duplicate] 【发布时间】:2013-09-21 07:30:26 【问题描述】:我正在尝试找到一种将 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();
【问题讨论】:
您可以使用 AutoMapper (github.com/AutoMapper/AutoMapper)。 【参考方案1】:要有效地做到这一点,需要元编程。您可以使用库来提供帮助。例如,“FastMember”包括一个 TypeAccessor,它提供对实例创建的快速访问和按名称访问成员。然而,这个例子基本上也是“dapper”的工作原理,所以你可以使用dapper:
int id = ...
var data = connection.Query<Order>(
"select * from Orders where CustomerId = @id",
new id ).ToList();
你也可以打开“dapper”代码看看它做了什么。
【讨论】:
以上是关于如何正确地将 DataReader 转换为 DTO/List<DTO>? [复制]的主要内容,如果未能解决你的问题,请参考以下文章