我正在开始一个新的应用程序。我对数据库运行查询,然后返回海关对象列表。这是一个例子:
使用这种方法,我可以获得一个表的所有记录。示例:从 PKR_PLAYER 中选择 ID、名称、姓氏
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();
}
}
简而言之,这个想法是遍历 SqlDataReader(带有收益返回)并创建一个实体,最后将其存储在一个列表中。
我认为这会消耗大量资源。该查询返回大约 22k 条记录,并且 GetAll 方法将被非常频繁地调用。有时会每隔 1 或 2 分钟调用一次 GetAll 方法。
我只执行了几次(大约 10 次)GetAll 方法,Windows 任务管理器上的信息显示内存在几秒钟内从 17MB 增长到 45MB。
我相信这段代码不是性能。
问题是:我怎样才能使代码消耗更少的内存?可能我必须更改列表,但有什么替代方法?