2011-08-05 3 views
1

ASP.NET MVC3, Razor 및 Entity Framework를 사용하는 페이지에서 작업하고 있습니다. 미니 프로파일 러를 잡기 위해 Nuget을 사용했고 SQL 호출이 모든 컬럼을 쿼리하고 있다는 것을 알았습니다. IEnumerable을 사용하여 scaffold 된 뷰를 사용하고 있으므로 컨트롤러가 View (Type.ToList())를 반환하므로이 문제가 발생하고 있음을 알 수 있습니다.EF & Razor 사용하지 않는 열 유지하기

내 무릎 멍청한 반응은 내가 필요로하는 열만 선택하고 목록에 넣으려고했지만 내 "강력한"EF 유형과 탐색 속성과 같은 항목을 잃어 버릴 수도 있습니다.

EF가 쿼리중인 테이블 열의 특정 하위 집합에 대해서만 데이터를 반환하도록 지시 할 수 있습니까?

+0

요점은 모든 엔티티가 모든 속성으로로드되었거나 엔티티가 아닌 사용자 지정 또는 익명 형식으로 투영하여로드 성능을 향상시키는 것입니다. 프로젝션은 완전히 통제 할 수 있으므로로드하려는 엔티티와 관련 데이터까지 선택해야합니다. –

+0

바람직하지 않은 열을 생략하면서 데이터베이스 제약 조건, null 및 참조 (탐색 속성에 필요한 경우)를 준수하면서 엔티티를로드 할 수 있다면 좋지 않겠습니까? 나도 알다시피, 그것은 케이크이고 그것도 상황을 먹지 만, 자주 테이블의 아주 작은 부분에 대한 EF 혜택을 원한다. –

답변

1

목록을 IQueryable (그냥 .ToList() 제외)으로두고보기 내에서 선택하여 변경할 수 있습니다. 결과를 열거 할 때까지 SQL 쿼리 실행이 연기되기 때문에 뷰에 추가 한 모든 필터가 쿼리를 구체화합니다. 당신이 그것을 어떻게 보느냐에 따라, 그런 종류의 헷갈림이 우려의 분리와 함께.

로보기 코드가 될 것이다 :이 접근을한다면

@model IQueryable<SomeType> 
<ul> 
@for(var item in Model.Select(x => new { x.Property1, x.Property2 })) { 
    <li>@item.Property1</li> 
} 
</ul> 

것은, 당신이 (당신이 두 번 이상 된 IQueryable을 열거하지 않았는지 확인하기 위해보기에 매우 신중해야합니다 것 이로 인해 데이터베이스 쿼리가 추가되고 성능상의 이점이 없어집니다).

가장 안전한 방법은보기마다 사용자 지정보기 모델을 만들어 프로젝트에 적용하는 것이지만 질문에 실제로 대답하는 것은 아닙니다.

+0

응답 해 주셔서 감사합니다. 나는 그것이 옳았 기 때문에 지금 당장 upvoted했습니다. 나는 그것을 시도 할 수있는 기회를 아직 가지고 있지 않다. 나는 그것이 효과가 있음을 확인하자마자 대답으로 표시 할 것이다 :-) –

관련 문제