2014-11-29 2 views
0

Entity Framework를 사용하여 데이터베이스에서 데이터를로드하고 있습니다. I는 페이지 번호 파라미터 제어기로 전달되는 페이지 당 10 개 개의 요소를 표시해야 ASP MVC 컨트롤러를 갖고 : 여기서예외없이 List.GetRange에 대체 하시겠습니까?

public ActionResult Blog([DefaultValue(0)] int page) 
{ 
    var blogPosts = db.BlogPosts.ToList() 
     .OrderByDescending(i => i.PublishTime) 
     .ToList() 
     .GetRange(page * 10, 10); 

    return View(blogPosts); 
} 

상기 GetRange(page * 10, 10) 호출은 여러 경우, 예컨대 예외를 발생시킬 수 목록에 요소가 10 개 미만이거나 page * 10 색인이 범위를 벗어난 경우

많은 바운드 검사를 통해 해결할 수 있습니다. 이 문제를 해결하는 좀 더 우아한 방법이 있을까요? 가능하다면 10 요소를 반환하는 솔루션을 찾고 있습니다. 그렇지 않으면 null 또는 빈 목록을 반환 할 수 있습니다.

예를 들어, 27 개 소자, 제 1 및 제 2 페이지 (page == 0 || page == 1)에서 7 개 요소 및 널 (null)/빈 목록을 반환 네 번째 페이지 (page == 3)를 반환 10 개 요소, 세 번째 페이지 (page == 2)가 목록을 반환한다.

답변

5

어쨌든 페이징 전에 .ToList()을 사용하지 않으려면 모든 레코드를 가져오고 성능을 저해하는 코드에서 필터링을 수행하면됩니다.

그냥 엔티티 프레임 워크에 의해 적절한 SQL로 변환됩니다 .Skip().Take(), 사용

int pageSize = 10; 
var blogPosts = db.BlogPosts 
        .OrderByDescending(i => i.PublishTime) 
        .Skip(page * pageSize) 
        .Take(pageSize) 
        .ToList(); 
관련 문제