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