Вот мой пример кода, который я использую для извлечения данных из базы данных: на слое DAO:
public IEnumerable<IDataRecord> GetDATA(ICommonSearchCriteriaDto commonSearchCriteriaDto)
{
using(DbContext)
{
DbDataReader reader = DbContext.GetReader("ABC_PACKAGE.GET_DATA", oracleParams.ToArray(), CommandType.StoredProcedure);
while (reader.Read())
{
yield return reader;
}
}
}
На слое BO я вызываю вышеупомянутый метод, например:
List<IGridDataDto> GridDataDtos = MapMultiple(_costDriversGraphDao.GetGraphData(commonSearchCriteriaDto)).ToList();
на уровне карты MapMultiple метод определяется следующим образом:
public IGridDataDto MapSingle(IDataRecord dataRecord)
{
return new GridDataDto
{
Code = Convert.ToString(dataRecord["Code"]),
Name = Convert.ToString(dataRecord["Name"]),
Type = Convert.ToString(dataRecord["Type"])
};
}
public IEnumerable<IGridDataDto> MapMultiple(IEnumerable<IDataRecord> dataRecords)
{
return dataRecords.Select(MapSingle);
}
Вышеприведенный код работает хорошо и хорошо, но я задаюсь вопросом о двух проблемах с вышеуказанным кодом.
- Как долго будет открываться соединение для чтения данных?
- Когда я рассматриваю только коэффициент производительности кода, полезно ли использовать return yield вместо добавления записи в список и возврата всего списка?