是否在DbDataReader上实现了IQueryable?

时间:2009-06-24 22:54:20

标签: linq linq-to-sql ado.net

我有很多使用原始ADO.NET(DbConnection,DbDataReader等)的现有代码。我想转换为使用LINQ to SQL获取新代码,但是现在将现有代码和新代码放在一组统一的Repository类之后。

我遇到的一个问题是:我希望Repository类将结果集公开为IQueryable<>我通过LINQ to SQL免费获得。如何将现有的DbDataReader结果集包装在IQueryable中?我是否必须从头开始在DbDataReader上实现IQueryable?

注意我知道LINQ to DataSet,但由于内存规模问题,我不使用DataSet,因为我处理的结果集可能非常大(1000s的顺序)。这意味着IQueryable优于DbDataReader实现也需要高效(即不将结果缓存在内存中)。

1 个答案:

答案 0 :(得分:6)

我看不到实施IQueryable<T>带来的任何好处 - 这表明功能比实际可用更多 - 但是,您可以轻松地将其实现为IEnumerable<T>,但需要注意的是-只要。迭代器块是一个合理的选择:

    public static IEnumerable<IDataRecord> AsEnumerable(
        this IDataReader reader)
    {
        while (reader.Read())
        {
            yield return reader; // a bit dangerous
        }
    }

“有点危险”是因为来电者可以将其丢回并滥用它......