2011-04-08 5 views
0

는 정상의 LINQ 표현이 같은 것 생각해
내가 넣어하기로 결정한다면LINQ 저장 프로 시저와 (L2E)와 된 IQueryable

IQueryable<Person> personQuery= (from ppl in PersonContext 
         select ppl).ASQueryable(); 


List<Person>personList = personQuery.where(x => x.age==13).ToList(); 

을 (이 일을 더 이해할 수 있도록 단지 샘플입니다) 저장 프로 시저 내에서 linq 쿼리의 첫 번째 부분은
일이 이런 식으로 작동합니다.

IQueryable<Person> personQuery= PersonContext.sp_RetrievePerson().ASQueryable(); 

List<Person> personList = personQuery.where(x => x.age==13).ToList(); 

그래서 첫 번째 방법은 toList()가 호출 될 때만 SQL 호출을 보냅니다. 다른 말로
, 실행을 위해 SQL로 전송되는 쿼리는 다음 쿼리 실행을 위해 전송됩니다 얼마나 많은 시간을

Select * from Person where age=13 

그러나 방법 2

가 될 것인가?
저장 프로 시저가 더 빠른 실행을 위해 알려져 있고 SQL에 보낸 쿼리를 어떻게 표시 할 것인가 때문에 저장 프로 시저를 호출하는 것이 1 회만 전송되면 저장 프로 시저를 호출하는 것이 불필요합니까?

답변

2

이 항목에 대해 잘 모르지만 PersonContext.sp_RetrievePerson()은 내부적으로 DbDataReader를 사용하는 ObjectResult을 반환합니다. 즉, 저장 프로 시저가 한 번 호출되면 personQuery.where(x => x.age==13)이 결과 행을 반복하고 일치하는 개체가 필터링되지 않습니다.

저장 프로 시저를 사용하면 데이터베이스를 쿼리 할 때 성능이 약간 떨어질 수 있지만 데이터베이스에서 데이터베이스를 읽은 후 persons 테이블의 각 개체를 평가해야합니다. 따라서 데이터베이스에 이미있는 결과를 필터링하기 위해 저장 프로 시저에 매개 변수 age을 제공하면 저장 프로 시저를 사용하는이 시나리오에서는 의미가 있다고 생각합니다.

+0

이것은 내가 추측하고있는 것입니다. 원인에 대해서는이 샘플 쿼리보다 복잡합니다. 나는 외부 조인과 노동 조합과 같은 것들에 관해서는 SQL에 능숙하지 못합니다. 하지만 LINQ 코딩을 사용하면 더 잘 조작 할 수 있으며 원인을 쉽게 유지할 수 있습니다. 내가 사용하고있는 테이블에는 최소한 5 개의 노동 조합이 포함되어 있습니다.이 노동 조합 세그먼트에는 외부 조인이 많이 있습니다. 요약하면, 그 쿼리를 작성한 사람은 너무 경건하지만 그것을 유지해야했습니다. –

관련 문제