将来自数据库的数据存储在通用列表中

时间:2013-01-24 05:10:29

标签: c# asp.net ado.net

我使用通用列表来存储通过查询数据库来获得的数据。我实际上使用了多行类的List。 但我的问题是我的类有近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多个属性以上我只使用了两个属性。我认为这是非常低效的

3 个答案:

答案 0 :(得分:0)

您可以如何实现基类?您可以使用最多使用属性创建另一个类,并在类中使用该类的对象。

答案 1 :(得分: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();
}

答案 2 :(得分:0)

我建议您为SqlDataReader编写扩展方法,并使用linq中的方法从返回的读取行中获取所需的列。

扩展方法:

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

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