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 個を超えるプロパティがあり、それ以上では 2 つのプロパティしか使用しません。非常に非効率的だと思います

4

3 に答える 3

0

I would like to suggest you to write a extension method for SqlDataReader and make use of the method in linq to fetch required columns from the returned rows of reader.

Extension method:

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

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

This result list has only the required properties you select and helps to reduce the consumption of memory for unwanted properties.

于 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 に答える
0

基本クラスの実装方法を教えてください。使用する属性が最も多い別のクラスを作成し、クラス内でそのクラスのオブジェクトを使用できます。

于 2013-01-24T05:12:42.520 に答える