データベースからデータをフェッチするために使用しているサンプルコードは次のとおりです。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);
}
上記のコードはうまく機能していますが、上記のコードに関する2つの懸念について疑問に思っています。
- データリーダーの接続はどのくらいの期間開かれますか?
- コードのパフォーマンス要因のみを考慮する場合、レコードをリストに追加してリスト全体を返すのではなく、「yield return」を使用することをお勧めしますか?