将 SQL 数据转换为通用列表

Converting SQL Data to List of generic

我有一个 table 充满字符串的字符串,我需要将其转换为具有类型的通用对象列表。到目前为止我有什么。

private List<T> ConvertDataToObject<T>(object oClass, string sSQL)
{
    List<T> lReturn = new List<T>();
    SqlConnection sqlCon = new SqlConnection(sqlConnString);
    SqlCommand sqlCom = new SqlCommand(sSQL.ToString());
    sqlCom.Connection = sqlCon;
    try
    {
        sqlCon.Open();
        SqlDataReader sqlDR = sqlCom.ExecuteReader();
        while (sqlDR.Read())
        {
            foreach (var prop in oClass.GetType().GetProperties())
            {
                if (prop.Name == sqlDR[prop.Name])
                { 
                    prop.SetValue(oClass, Convert.ChangeType(sqlDR[prop.Name].ToString().Trim().Replace("'", "''"), prop.PropertyType), null); 
                }
            }
        }
    }
    catch
    { }
    finally
    { sqlCon.Close(); }

    return lReturn;
}

我认为这是不正确的: 1:我需要用对象填充列表,但我不确定该怎么做 2:我不确定2个循环是填充对象的最佳方式。

我写了一个 class 来将数据库查询结果映射到过去的对象。此实现中唯一的 "gotcha" 是 SQL 列名称需要匹配 class.

的 属性 名称

这是class:

public class DataObjectMapper<T> where T : new()
{
    public List<T> MapResultsToObject(IDataReader reader)
    {
        List<T> objects = new List<T>();

        while (reader.Read())
        {
            objects.Add(MapRow(reader));
        }

        return objects;
    }

    private T MapRow(IDataReader reader)
    {
        T item = new T();

        var typeProperties = typeof(T).GetProperties();

        foreach (var property in typeProperties)
        {
            int ordinal = reader.GetOrdinal(property.Name);

            if (!reader.IsDBNull(ordinal))
            {
                property.SetValue(item, reader[ordinal].ToString(), null);
            }
        }

        return item;
    }
}

这是它的用法

   DataObjectMapper<T> resultsMapper = new DataObjectMapper<T>();

   SqlDataReader reader = command.ExecuteReader();

   List<T> results = resultsMapper.MapResultsToObject(reader);