2009-06-24 56 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 
     } 
    } 

的「有點危險」,是因爲主叫方可以將它轉換回和濫用它......