是否在DbDataReader上实现了IQueryable?

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也需要高效(即不将结果缓存在内存中).

Mar*_*ell 6

我看不出任何实现的好处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)

"有点危险"是因为来电者可以把它丢回并滥用它......