2014-06-13 5 views
0

.NET 4.5를 사용하는 OData 웹 API 서비스가 있습니다. 당신이 볼 수 있듯이서버 쪽 페이징 크기를 수정하는 방법

public class WorkItemsController : EntitySetController<WorkItem, string> 
{ 
    [Queryable(PageSize=100)] 
    public override IQueryable<WorkItem> Get() 
    {## Heading ## 
     // go to AWS DynamoDb, get the workitems and then return 
    } 
} 

, 나는 기본적으로 100으로 서버 측 페이지 크기를 설정 : 그것은 EntitySetController에서 파생 된 WebApi 컨트롤러를 가지고있다. 나중에 Get() 함수 내에서 프로그래밍 방식으로 크기를 늘려야한다는 것을 알고 있습니다. 아무도 그것을하는 방법을 알고 있습니까?

이유를 알고 싶다면 여기에 이유가 있습니다. AWS DynamoDb는 $ skip 또는 $ top 쿼리를 지원하지 않습니다. 클라이언트가 작업 항목 모음을 가져올 때마다 DynamoDb에서 모든 작업 항목을 가져와야합니다. 숫자가 클 경우 사용자에게 100 개의 항목 만 반환 할 때마다 매우 오랜 시간이 걸립니다. 그래서 우리 전략은 우리가 매번 사용자에게 반환하는 작업 항목의 수를 두 배로 또는 세 배로하는 것입니다. 따라서 사용자는 연속 요청으로 100, 200, 400, 800 작업 항목을 가져옵니다. DynamoDb에 1500 개의 작업 항목이 있다고 가정하면 모든 항목을 다시 사용자에게 반환하는 데 4 번만 쿼리합니다. 100 같은 일정한 페이지 크기를 유지한다면 15 번 쿼리해야합니다.

답변

0

이것은 정확히 LINQ2DynamoDB 주소 문제입니다. $ skip 및 $ top (Enumerable.Skip() 및 Enumerable.Take())를 지원하기 위해 DynamoDb에서 반환 한 결과를 ElastiCache에 캐시합니다. 따라서 서버 측 페이징이 훨씬 효율적으로 작동하고 읽기 작업 수가 크게 감소합니다.

또한 LINQ2DynamoDB은 자동으로 OData를 지원하므로 WebApi 컨트롤러를 수행 할 필요가 없습니다.

왜 사용해 보지 않으시겠습니까? :)

2

메소드에서 ODataQueryOptions를 호출하고 페이지 크기를 설정할 수 있습니다.

public IQueryable Get(ODataQueryOptions queryOptions) 
{ 
    var settings = new ODataQuerySettings { PageSize = 100 }; 
    var result = GetResult(); 
    return queryOptions.ApplyTo(result, settings); 
}