2009-10-13 2 views
2

LINQ to SQL을 사용하는 작은 테스트 웹 응용 프로그램을 만들었습니다. ObjectDataSource 및 GridView가 있습니다. GridView의 데이터 소스는 ObjectDataSource입니다. 이제이 ObjectDataSource는 MyTasks라는 하나의 클래스 (메서드 이름 : GetAllTasks())를 사용하여 Linq를 사용하여 SQL의 Tasks 테이블에서 모든 작업을 SQL에 채 웁니다. 저장 프로 시저 GetAllMyTasks()를 호출합니다.LINQ to SQL 호출 저장 프로 시저

나는 완벽하게 작동하는 다음과 같은 방법이 있습니다.

public static IEnumerable<GetAllMyTasksResult> GetAllTasks() 
{ 
    MyTasksDataContext db = new MyTasksDataContext(); 
    var tasks = db.GetAllMyTasks().Select(x => x); 
    return tasks; 
} 

지금 내가 일회용 MyTasksDataContext 객체를 생성하는 핵심 단어를 사용하여 사용할 수 있도록 단지 코드를 다음과 같이 위의 코드를 교체하려고합니다. 그것은 "리더가 닫혀있을 때 Read를 호출하는 시도가 잘못되었습니다."라는 에러 메시지를 낸다. 내가 여기서 누락 된 것이 있습니까?

public static IEnumerable<GetAllMyTasksResult> GetAllTasks() 
{ 
    using (MyTasksDataContext db = new MyTasksDataContext()) 
    { 
     var tasks = db.GetAllMyTasks().Select(x => x); 
     return tasks; 
    } 
} 

아무도 나에게 이유를 제공 할 수 있습니까? MyTasksDataContext 객체가 dispose 메서드를 호출하고 있다는 것을 알고 있습니다.

+3

Select (x => x)는 Enumerable 메서드로도 사용할 수있는 것이 전혀 없음 –

답변

10

ToList() 확장 방법을 사용하여 열거를 일찍 평가하십시오.

public static IEnumerable<GetAllMyTasksResult> GetAllTasks() 
{ 
    using (MyTasksDataContext db = new MyTasksDataContext()) 
    { 
     return db.GetAllMyTasks().ToList(); 
    } 
} 

이 열거 오히려 연결이 배치 된 후보다는 사용 내부 원인 일 것이다.

열거 형을 'using'블록 내부에서 사용해야하는 이유는 LINQ가보다 강력한 쿼리 작성을 위해 '지연된 실행'이라는 것을 사용하기 때문입니다.

예를 들어 일반 함수가 페이징을 원하면 결과의 끝에 .Skip(30).Take(10)을 첨부하면 그 논리를 결과 SQL에 구울 수 있습니다.

추신 :
당신은 말했다 :

내가 내 MyTasksDataContext 개체가 해당 처분 메소드를 호출하는 것을 알고있다.

거짓입니다.

'using'-block은 개체 자체가 아니라 Dispose 메서드를 호출합니다. 그리고, 이후 썼습니다, Dispose 전화입니다.

+0

입니다. 람다 x => x와의 거래는 무엇인가? – Perpetualcoder

+0

방금 ​​삭제했습니다. 나는 그 자신을 궁금해하고 있었다. –

+0

@ 존 : 고마워. 이 변화는 저에게 효과적이었습니다. 하지만 열거가 처음에는 작동하지 않는 이유를 제발 들려 주시겠습니까? 기본적으로 메서드의 반환 형식은 ISingleResult 입니다.이제 ISingleResult는 IEnumerable , IEnumerable을 구현합니다. – Nirlep

3

John Gietzen이 언급 한 것처럼 ToList()는 즉각적인 문제를 해결합니다.

지연된 실행으로 인해 필요한 이유가 있습니다. 일반적으로 LINQ는 이 아니며 쿼리가 반복 될 때까지을 수행합니다. LINQ to SQL은 저장 프로 시저를 호출하지만 쿼리가 반복 될 때까지 결과에서 행을 읽지 않습니다.

+0

_ "LINQ to SQL은 저장 프로 시저를 호출하지만 행은 읽지 않습니다 **"_ 정확히! ** ISingleResult (ToList() 또는 Dispose())를 사용하거나 처리 할 때까지 ** SQL 서버에서 쿼리를 시작하고 ** PREEMPTIVE_OS_WAITFORSINGLEOBJEC으로 고정시킵니다 ** –