2009-06-24 2 views
2

원시 ADO.NET (DbConnection, DbDataReader 등)을 사용하는 기존 코드가 많이 있습니다. 새 코드에 LINQ to SQL을 사용하는 것으로 전환하고 싶습니다. 그러나 지금은 기존 코드와 새 코드를 통합 된 Repository 클래스 세트에 넣으십시오.DbDataReader를 통한 IQueryable 구현이 있습니까?

내가 가진 한 가지 문제점은 다음과 같습니다. 리포지토리 클래스에서 LINQ to SQL을 무료로 얻을 수있는 IQueryable <> 결과 집합을 노출하고 싶습니다. 기존 DbDataReader 결과 집합을 IQueryable로 래핑하는 방법은 무엇입니까? 처음부터 DbDataReader를 통해 IQueryable을 구현해야합니까?

참고 LINQ to DataSet에 대해 알고 있지만 메모리 크기 문제로 인해 DataSet을 사용하지 않습니다. 따라서 처리 할 결과 집합이 매우 커질 수 있습니다 (1000 초). 이는 DbDataReader를 구현하는 IQueryable이 효율적이어야한다는 것을 의미합니다 (즉, 결과를 메모리에 캐시하지 않음).

+0

: 반복자 블록은 합리적인 선택이 될 것입니다 IEnumerable

+0

니스 ... 그리고 내 도우미 클래스는 일반 같기 때문에 다음과 같이 보일 것입니다. : (read => BuildPerson (record)) (레코드 => RecordToObject (레코드)) – DSO

답변

5

IQueryable<T>의 구현에서 이점을 볼 수는 없지만 실제로는 사용할 수있는 기능보다 더 많은 기능을 제공합니다. 단 한 번만 언급하면 ​​쉽게 IEnumerable<T>으로 구현할 수 있습니다. 하나의 옵션 (계속 게으름을 유지 -

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

은 "조금 위험"호출자가 다시 캐스팅을 남용 할 수 있기 때문이다가 ... 귀하의 코멘트를 다시

+0

좋아요, 당신 말이 맞아요, IQueryable 대신 IEnumerable을 노출해야합니다. 또한, 이미 리다이렉션을 사용하여 IDataRecord 열 값에서 객체의 속성을 채우는 유틸리티 함수가 있으므로 Repository 메소드에서 IDataRecord 대신 엔티티 객체를 반환 할 수 있습니다. 감사합니다. – DSO

+0

이것은 LINQ와 잘 맞았습니다. DbDataReader reader = stmt.ExecuteReader(); // 여기에 WHERE 조건자를 추가하십시오. var 행 = reader.AsEnumerable()에서 _row select _row; // 행을 반복합니다. foreach (행의 var 행) –

관련 문제