0

我正在使用通用列表来存储通过查询数据库获得的数据。我实际上将类列表用于多行。但我的问题是我的类几乎有 20 多个属性,而且大多数时候我只使用它的 2 或 3 个属性。所以我想知道保持数据来自数据库的最佳方法是什么。

下面是我的代码

List<ImageGalleryCollection> tempList = new List<ImageGalleryCollection1>();
SqlConnection connection = Dal.GetConnection();
SqlParameter[] paramList = new SqlParameter[1];
paramList[0] = new SqlParameter("@cityId", cityId);
SqlDataReader data = Dal.ExecuteReaderSP(SPNames.GetRegCity, paramList, connection);

while(data.Read())
{
    ImageGalleryCollection igc = new ImageGalleryCollection1();

    igc.cityPhotoGalleryId = Convert.ToInt32(data["cityPhotoGalleryId"]);     
    igc.ImagePath = data["imagePath"].ToString();
    tempList.Add(igc);        
}

data.Close();
connection.Close();
return tempList;

在 ImageGalleryCollection 我有超过 20 个属性,以上我只使用两个属性。我认为它非常低效

4

3 回答 3

0

请问你的基类是怎么实现的?您可以创建另一个具有最多使用属性的类,并在您的类中使用该类的对象。

于 2013-01-24T05:12:42.520 回答
0

我想建议您编写一个扩展方法SqlDataReader并使用该方法linq从返回的 reader 行中获取所需的列。

扩展方法:

public static class DataReaderExtension
    {
        public static IEnumerable<Object[]> DataRecord(this System.Data.IDataReader source)
        {
            if (source == null)
                throw new ArgumentNullException("source");

            while (source.Read())
            {
                Object[] row = new Object[source.FieldCount];
                source.GetValues(row);
                yield return row;
            }
        }
    }

在 linq 中使用它:

using (SqlConnection cn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand("Select * from tblUser"))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = cn;
                    cn.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        var result = (from row in dr.DataRecord()
                                      select new
                                         {
                                             UserId = row[0],
                                             UserName = row[1]
                                         }).ToList();                        
                    }
                }
            }

此结果列表仅包含您选择的所需属性,有助于减少不需要的属性的内存消耗。

于 2013-01-24T07:10:38.753 回答
0
IEnumerable<ImageGalleryCollection> GetImageGalleryCollection()
{    

        SqlConnection connection = Dal.GetConnection();
        SqlParameter[] paramList = new SqlParameter[1];
        paramList[0] = new SqlParameter("@cityId", cityId);
        SqlDataReader data = Dal.ExecuteReaderSP(SPNames.GetRegCity, paramList,connection);
        while(data.Read())
        {
           ImageGalleryCollection igc = new ImageGalleryCollection1();

           igc.cityPhotoGalleryId = Convert.ToInt32(data["cityPhotoGalleryId"]);     
            igc.ImagePath = data["imagePath"].ToString();
            yield return igc;

        }
        data.Close();
        connection.Close();
}
于 2013-01-24T05:18:21.990 回答