2013-09-21 4 views
2

DataReader를 DTO로 변환하는 쉬운 방법을 찾으려고합니다 (열 이름과 같은 속성이 있음). 하지만 어떻게 반사가 performace에 영향을 미칠지 궁금하네요 아마 어쩌면 더 쉽고/깨끗한 방법으로 그것을 할 수 있습니다.DataReader를 DTO/List <DTO>으로 올바르게 변환하는 방법은 무엇입니까?

나는보고 있었으나 괜찮은 해결책을 찾지 못했습니다 (중복 된 질문에서도).

는 여기를 효율적으로이 작업을 수행하려면 "숙제"

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(); 
     } 
    } 
+1

AutoMapper (https://github.com/AutoMapper/AutoMapper)를 사용할 수 있습니다. – kmatyaszek

답변

1

위해 한 메타 프로그래밍이 필요거야. 라이브러리를 사용하여 도움을받을 수 있습니다. 예를 들어, "FastMember"는 인스턴스 작성 및 구성원 액세스에 대한 빠른 액세스를 이름별로 제공하는 TypeAccessor를 포함합니다. 그러나,이 예제는 작동 정확히 어떻게 "단정"기본적으로도, 그래서 당신은 단지 사용 날씬한 수 :

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

당신은 또한 무엇을 볼 수있는 '날씬한'코드를 열 수 있습니다.