2009-06-24 57 views
2

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

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

注意我知道LINQ to DataSet,但由于内存扩展问题,我不使用DataSet,因为我处理的结果集可能相当大(数量级为1000)。这意味着IQueryable over DbDataReader实现也需要高效(即不要将结果缓存在内存中)。

+0

回复您的评论 - 一个选项(即仍然保留懒惰等等)是`选择' - 即reader.AsEnumerable()。选择(记录=> BuildPerson(记录))等 - 它给你一个IEnumerable 2009-06-25 07:13:06

+0

尼斯...和我的助手类是通用的,所以它看起来像这样: reader.AsEnumerable()。Select(record => RecordToObject (record)) – DSO 2009-06-25 07:31:54

回答

5

我看不出实施IQueryable<T>的任何好处 - 它暗示着比实际可用的功能更多的功能 - 但是,您可以很容易地将其实现为IEnumerable<T>,但要注意的是它只有一次。迭代器块将是一个合理的选择:

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

的“有点危险”,是因为主叫方可以将它转换回和滥用它......