San*_*Rai 16 c# linq using datareader yield-return
这是我用来从数据库中获取数据的示例代码:在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在BO层我调用上面的方法,如:
List<IGridDataDto> GridDataDtos = MapMultiple(_costDriversGraphDao.GetGraphData(commonSearchCriteriaDto)).ToList();
Run Code Online (Sandbox Code Playgroud)
在mapper层上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);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行良好,但我想知道上述代码的两个问题.
Mar*_*ell 15
.ToList()
,所以它会没事的.在更一般的情况下,是的:读者将花费你花费的时间来迭代它; 如果你这样做.ToList()
会很少; 如果你做了一个foreach
和(对于每个项目)发出外部http请求并等待20秒,那么是 - 它将打开更长时间.如果你返回一个迭代器块,调用者可以决定什么是理智的; 如果你总是返回一个列表,他们没有太多选择.第三种方式(我们在短小精悍的做法)是做出他们的选择; 我们有一个可选bool
参数,默认为"返回一个列表",但调用者可以更改它以指示"返回迭代器块"; 基本上:
bool buffered = true
Run Code Online (Sandbox Code Playgroud)
在参数中,和:
var data = QueryInternal<T>(...blah...);
return buffered ? data.ToList() : data;
Run Code Online (Sandbox Code Playgroud)
在实施中.在大多数情况下,返回列表是完全合理的,并避免了很多问题,因此我们将其作为默认值.
归档时间: |
|
查看次数: |
17445 次 |
最近记录: |