DSO*_*DSO 3 linq ado.net linq-to-sql
我有很多使用原始ADO.NET(DbConnection,DbDataReader等)的现有代码.我想转换到使用LINQ to SQL获取新代码,但是现在将现有代码和新代码放在一组统一的Repository类之后.
我遇到的一个问题是:我希望Repository类将结果集公开为IQueryable <>,这是我使用LINQ to SQL免费获得的.如何将现有的DbDataReader结果集包装在IQueryable中?我是否必须从头开始在DbDataReader上实现IQueryable?
注意我知道LINQ to DataSet,但由于内存规模问题,我不使用DataSet,因为我处理的结果集可能非常大(1000s的顺序).这意味着基于DbDataReader实现的IQueryable也需要高效(即不将结果缓存在内存中).
我看不出任何实现的好处IQueryable<T>- 这表明功能比实际可用的更多 - 但是,你可以IEnumerable<T>很容易地实现它,但需要注意的是它只是一次性的.迭代器块是一个合理的选择:
public static IEnumerable<IDataRecord> AsEnumerable(
this IDataReader reader)
{
while (reader.Read())
{
yield return reader; // a bit dangerous
}
}
Run Code Online (Sandbox Code Playgroud)
"有点危险"是因为来电者可以把它丢回并滥用它......