2010-05-13 4 views
2

나는 바보 같은 질문이 있습니다. 나는이 두 개의 쿼리 사이의 성능 차이가 있는지 알고 싶습니다 :LINQ 엔터티 쿼리 성능

var cObject = from cust in entities.Customer 
       where cust.id == cid 
       select cust; 

var cObject = entities.Customer.First(c=> c.id == cid); 

내 쿼리 반환 나는 차 키를 쿼리하고 같이 하나 개의 레코드 만. 그러나 그들은 어떤 차이를 만들어 낼 수 있습니까?

+0

첫 번째 코드 줄은 SQL을 실행하지 않습니다. 두 번째는 않습니다. 그렇습니다. 차이가있을 것입니다. –

+0

@Craig : DataContext가 레코드를 검색하기 위해 * 일종의 SQL을 실행해야합니까? –

+0

결과를 열거하는 경우에 발생합니다. 그러나 첫 번째 라인은 그렇게하지 않습니다. –

답변

3

성능은 현명해야합니다.

유형별로 차이가 있습니다. 첫 번째 요소는 단일 요소가있는 IEnumerable IQueryable 개체를 반환합니다. 두 번째는 실제로 Customer 객체를 반환합니다.

+0

첫번째 줄은 엄밀히 말하면'IQueryable'을 반환합니다.그러나 이것은 일반적으로 누군가가 실제로 쿼리 할 수 ​​있는지 조사 할 경우 일반적으로 정확합니다. –

0

성능이 없습니다.

먼저 마이크로 소프트 소개

var cObject = entities.Customer.First(c=> c.id == cid); 

편집 :

IQueryable 그런 다음 그들은 쉬운 일이 있다면

var cObject = from cust in entities.Customer 
      where cust.id == cid 
     select cust; 

편집 customer object

+0

그게 내가 생각한 것도 아니지만 저스틴의 대답이 여기에 게재 된 것을 참조하십시오 –

+0

나는 권력을 편집 할 계획이었을 때 .. 그런데 .. 그래서 .. .. 어쨌든 고마워. – anishMarokey

1

을 반환하기 위해, 여기에 설탕을 추가 반환하여 LINQ 제공 업체 포트를 "단일 레코드 쿼리"로 바꾸면 First을 사용하는 쿼리가 약간 더 빨라질 수 있습니다.

동일한 효과를 얻으려면 첫 번째 것을 사용하고 cObject.First()을 수행 할 수 있습니다.

1

크레이그 스턴트 (Craig Stuntz)는 질문에 대한 의견을 지적하기 때문에 지연로드 실행 지연으로 인해 프로파일 링 결과가 왜곡 될 수 있으므로 Linq 코드를 프로파일 링하는 데주의해야합니다.

명확한 읽기를 얻으려면 쿼리가 완전히 실행되도록하려면 ToList()을 호출해야합니다. 두 번째 예제에서 사과를 사과로 만들려면 똑같이해야합니다.

어쨌든 두 번째 쿼리가 단일 고객 개체 대신 하나의 고객 개체로 IEnumerable IQueryable을 반환하도록 다시 작성되었지만 두 문은 기능적으로 동일합니다.