2012-04-25 2 views
1

내가 서버에 볼 때 나는 내가 그것을이LINQ - 다시 너무 많은 행

var c = 
    (from l 
    in db.SOMETABLE 
    where l.Name= 'test' 
    select l).take(10); 

같이한다고 생각합니다 그래서 LINQ에이 쿼리를

select top(10) * 
from SOMETABLE 
where Name = 'test' 

변환하려고하지만거야 데려 프로파일 러 나는 linq이 테이블의 모든 데이터를 가져와 아마도 WHERE 및 TAKE를 데이터베이스에서 풀링 데이터를 가져 오는 것을 볼 수 있습니다.

문제는 SOMETABLE 레코드가 ~ 1000000 개이며 빠르게 작동하지 않는다는 것입니다.

내가 잘못 했습니까?

+2

'l.Name = 'test''와'.take'는 3 가지 다른 방법으로이 코드가 실제 코드가 아니라는 것을 즉시 알려줍니다. 당신이하고있는 일은 잘 작동 할 것이고 (쿼리 합성은 당신이 원하는 것을하기 위해 고안된 것입니다.), ** 실제 ** 코드에 잘못된 것이 있습니다. 따라서 ** ** 실제 ** 코드를 보여주십시오. –

답변

7

게시 한 코드에 실수가 3 개 이상 있으므로 실제 코드는이 아닌 것으로 간주합니다. 귀하가 묘사하는 증상을 얻으려면 가장 가능성있는 원인은 IEnumerable<T>을 어딘가에서 사용했으며 그 중에서 을 작성하고 있다는 것입니다. 종단 간 쿼리 구성 (예 : TOP을 데이터베이스에서 처리)을 얻으려면 IQueryable<T>을 사용해야합니다.

IEnumerable<SomeType> data = db.SomeTable; 

var c = (from l in data 
     where l.Name == "test" 
     select l).Take(10); 

있지만 다음은 첫 번째 행이 변경되었음을 주목 절대적 괜찮 예를 들어, 다음은 고장

IQueryable<SomeType> data = db.SomeTable; 

var c = data.Where(l => l.Name == "test").Take(10); 
:

IQueryable<SomeType> data = db.SomeTable; 

var c = (from l in data 
     where l.Name == "test" 
     select l).Take(10); 

이 또한 동일한 지 주목

그래서 : IEnumerable<T> (또는 목록과 같은 유사 항목)을 조기에 강제로 보내지 않았는지 확인하십시오.

마지막주의 사항으로, IIRC Entity Framework는 스킵/테이크를 적용하는 경우 주문을 요구합니다. 그렇지 않은 경우 오류가 발생합니다. 이는 내가 IEnumerable<T>으로 너무 일찍 떨어 졌다고 추측 할 수는 있지만 지원하지 않습니다. order by도 지정해야한다면 놀랄 것입니다.

+0

내 테이블이 IEnumerable입니다. 감사! – spdro