1

MVC3, .NET4.5, EF6.1, SQL Server 2008 SP2를 사용하고 있습니다. 분명히Foreach 명령에서이 LINQ/EF 쿼리가 여러 번 실행됩니까?

foreach (var item in Model.myOrder.OrderBy(r =>r.Supplier.CompanyType.SortOrder).ThenBy(r => r.SortOrder).ThenBy(r => r.Date).ThenBy(r => r.Id).ToList()) 
{ 
<tr> 
    <td>@item.Id</td> 
    <td>@item.Supplier.Name</td> 
    <td>@item.Date</td> 
</tr> 
} 

내가 inmemory 주위를 반복 한 번만 DB를 조회 할 수있는 LINQ 쿼리, 다음의 Foreach 명령을 원하는 :

나는 테이블을 빌드 내보기에, 다음과 같은 라인을 가지고 수집. 내 추적에서이 foreach 단계는 예상보다 오래 걸리는 것처럼 보입니다. 반복 당 약 250ms입니다.

쿼리가 DB를 반복 할 때마다 반복 될 수 있다고 생각합니까? 그렇다면 DB에 한 번 치게 할 수 있습니다. Foreach 성명서에서 .tolist()를 사용하면 열정적 인로드가 필요하다고 생각했습니다.

감사합니다. 난 그냥이 내 코드를 변경 한 것처럼

편집

내 의심이 올바른지 확실하지 않다 : EF6 +에서

var myItems = Model.myOrder.OrderBy(r =>r.Supplier.CompanyType.SortOrder).ThenBy(r => r.SortOrder).ThenBy(r => r.Date).ThenBy(r => r.Id).ToList(); 
    foreach (var item in myItems) 
{ 
<tr> 
    <td>@item.Id</td> 
    <td>@item.Supplier.Name</td> 
    <td>@item.Date</td> 
</tr> 
} 
+0

내가 확인할 것 중 하나는 속성 중 일부가 지연로드 된 것입니다. 실제 쿼리는 O (1) 스타일 쿼리 일 수 있지만 지연이있는 경우 O (N + 1) 쿼리로 끝날 수 있습니다. – Zipper

+0

@Zipper를 이용해 주셔서 감사합니다. foreach 문에서 LINQ 쿼리가 존재할 수있는 N + 1 문제를 제외하고 DB에 대해서만 한 번 실행된다는 것을 다른 사용자가 확인할 수 있습니까? – SamJolly

답변

1

기본 동작은 실행시 메모리에 쿼리 결과를 읽는 것입니다. 따라서 원칙적으로 원래 코드와 두 번째 패스는 거의 동일한 성능 프로파일을 가져야합니다.

this CodePlex article을 참조하십시오.

편집 : 덧붙여 말하자면, 이것을 자신에게 증명하려면 페이지 렌더링 중에 SQL 프로파일 세션을 실행하십시오. 쿼리를 한 번만 실행하면됩니다.

+0

감사합니다. 나는 이제 네가 옳았다는 것을 확신한다. "Glimpsing"이후로 나는 중복 쿼리와 N + 1 동작을 확인했습니다. ToList()는 더 이상 필요하지 않습니다. 열심히로드 할 수 있도록 추가했습니다. – SamJolly