正在将SQL数据转换为泛型列表

本文关键字:泛型 列表 转换 数据 SQL | 更新日期: 2023-09-27 18:20:38

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

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个循环是否是填充对象的最佳方式。

正在将SQL数据转换为泛型列表

我以前写过一个类来将DB查询结果映射到对象。这个实现中唯一的"问题"是SQL列名需要与类的属性名匹配。

这是类别:

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