新しいアプリケーションを開始しています。データベースに対してクエリを実行してから、税関オブジェクトのリストを返します。次に例を示します。
このメソッドを使用して、テーブルのすべてのレコードを取得します。例:SELECT ID、NAME、LASTNAME FROM PKR_PLAYER
public List<TEntity> GetAll()
{
List<TEntity> all = new List<TEntity>();
String query = String.Format("SELECT {0} FROM {1}",AllFieldsSelection,TableName);
var data = SqlExecutionData.Create().WithConn(ConnectionString).WithQuery(query);
foreach (IDataRecord record in SqlServerUtils.GetRecords(data))
{
all.Add(CreateOneFromRecord(record));
}
return all;
}
これを使用して、レコードに保存されているデータを使用してTEntityObjectを作成します
private TEntity CreateOneFromRecord(IDataRecord record)
{
var result = new TEntity();
for (int i = 0; i < record.FieldCount; i++)
{
ColumnMap colMap = maps.FirstOrDefault(x => x.Column.Equals(record.GetName(i)));
if (colMap == null || record.IsDBNull(i)) continue;
object value = record.GetValue(i);
colMap.PropertyInfo.SetValue(result, value, null);
}
return result;
}
クエリを実行する方法
public static IEnumerable<IDataRecord> GetRecords(SqlExecutionData data)
{
using (SqlConnection sqlConnection = new SqlConnection(data.ConnectionString))
using (SqlCommand command = new SqlCommand(data.Query, sqlConnection))
{
if (data.Parameters!=null && data.Parameters.Count > 0)
{
foreach (String key in data.Parameters.Keys)
command.Parameters.AddWithValue(key, data.Parameters[key]);
}
sqlConnection.Open();
using (IDataReader rdr = command.ExecuteReader())
{
while (rdr.Read())
{
yield return (IDataRecord)rdr;
}
}
sqlConnection.Close();
}
}
簡単に言うと、(yield returnを使用して)SqlDataReaderを反復処理し、エンティティを作成して、最終的にリストに保存するという考え方です。
これは多くのリソースを消費すると思います。クエリは約22kレコードを返し、メソッドGetAllは非常に頻繁に呼び出されます。GetAllメソッドが1分または2分ごとに呼び出される場合があります。
GetAllメソッドを数回(約10回)実行すると、Windowsのタスクマネージャーの情報から、メモリが数秒で17MBから45MBに増加することがわかります。
このコードはパフォーマンスではないと思います。
問題は、コードがより少ないメモリを消費するようにするにはどうすればよいですか?リストを変更する必要があるかもしれませんが、代替手段は何ですか?