2012-02-17 2 views
5

난 DAL에 공급하는 방법이있다 :LinqToSql을 사용하여 수익률 데이터베이스 레코드를 반환합니까?

public IEnumerable<RecordType> GetRecords() 
{ 
    using (LinqDataContext context = new LinqDataContext()) 
    { 
     var records = context.RecordTable; 

     foreach (RecordType record in records) 
     { 
      yield return record; 
     } 
    } 
} 

소비자 방법은 foreach 루프 레코드를 사용한다. 이 방법은 LinqToSql이 장면 뒤에서 DataReader를 사용하기 때문에 RecordTable의 모든 레코드를 캐싱하지 않아도 메모리 사용량을 절약하고자합니다.

  1. 수율을 돌려 위의 자원을 보존하고 빨리 배열에 모든 레코드를 캐시에 비해 작동하는 것이 사실인가 (.ToArray()) :

    그래도 난이 시나리오에 대한 두 가지 질문이 있습니까? 오류가 소비하는 방법의 foreach 루프 내에서 발생할 경우 소비 방법은 (중간에 foreach 루프를 중단 할 경우

  2. 가 데이터 연결이 자동으로 적절하게 (필자는 using 문을 의미) 종료됩니다 같은 발견 또는 필수 기록 및 break)?

답변

3

, 그것은 을 할 수 그런 식으로 작동 할 수 있습니다 (물론 가능합니다). 그러나 알몸의 쿼리를 수행하는 경우 Table<T>, 일 수도 있고 일 수 있습니다. 당신은 아마도 iteration 동안 카운트를 질의하거나 trace를 실행 해 볼 수있을 것이다. 이 경우에 나는 용의자이 먼저 버퍼링됩니다.

다시 폐쇄 : 또한 따라 달라집니다; P는 사람이 foreach를 사용하는 경우, 다음 예 : foreach 때문에 명시 적으로 finally를 통해 반복자를 처분한다. 하나! 사람이하는 경우는 보장 할 수 없습니다 (매우 나쁜 및 LAX) 예를 들어 :

다음
var iter = yourData.GetEnumerator(); 
if(iter.MoveNext()) { 
    Console.WriteLine(iter.Current.Name); // first record of, say, 20 
} 
// and don't dispose the iterator == bad 

이후 반복자하지 않습니다 A : 자체 배출 및 C : 그것을 충돌하지 않는 배치, B 얻을 제대로 종료되지 않습니다 (이러한 3 가지 조건 중 하나가 일 때이 올바르게 닫힙니다). 강조 : 병적 인 경우입니다 : 일반적으로 "예, 닫을 것"이라고 말하는 것이 합리적입니다. 당신이 보장 비 버퍼링을 원하는 경우에

, 당신은 bufferedfalse에 설정하면 해당있다 "단정"참고 :

IEnumerable<Customer> customers = connection.Query<Customer>(
     "select * from Customer", buffered: false); 

(그것은 또한 매개 변수 등을 처리 할 수 ​​있습니다)

3

1) yield 반드시 모든 값을 얻을 빨리되지 않습니다,하지만 데이터베이스가 모든 결과를 반환하기 전에 코드가 결과를 처리 시작할 수있다. 즉, yield는 반환되는 첫 번째 결과를 표시하는 반면 ToArray()는 반환하기 전에 모든 결과가 표시 될 때까지 기다려야합니다. 물론 기본 제공 업체가 버퍼링이나 기타 이유로 인해 모든 결과를 한 번에 반환하는 경우에는 차이가 발생하지 않을 수 있습니다.

2) 예, using 당신이 사용하는 블록을 종료하는 방법에 상관없이 LinqDataContext 처분하지 않습니다 (예외/리턴/휴식/...) 기본 쿼리를 실행하는 경우

+1

사실, 2는 "호출자가 올바르게 작동하는 한"- 엄격히 말하면 대부분의 '사용 중'은 –

+0

입니다. @MarcGravell 나는 당신이 (정확하게) 완전한 Enumerable을 열거하거나 다른 것을 놓치고 있습니까? –

+0

예, 반복기를 수동으로 걷고 잘못 수행합니다. 대부분의 제정신 인 사람들이 사용할 foreach를 사용할 때 문제가되지 않습니다. –

2
  1. 반복자가 느슨하게 평가됩니다. 첫 번째 항목을 가져온 다음 소비자에게 "반환"합니다.성능에 미치는 영향은 LinqDataContext가 구현되는 방식에 달려 있습니다 (내부적으로 캐시 할 수 있습니다). ToArray() 또는 ToList()를 사용하면 진행하기 전에 모든 요소를 ​​LinqDataContext 밖으로 강제로 가져옵니다. 따라서 ToArray()를 사용하면 LinqDataContext가 모든 요소를 ​​반환 할 때까지 아무것도 반환하지 않습니다. 그게 최선인지 아닌지는 당신에게 달린 것입니다.
  2. 예, "사용 중"이 올바르게 적용됩니다.
관련 문제