2013-05-07 2 views
0

EntitySetController을 사용하여 사용자 지정 호출을 구현하려고합니다.EntitySetController를 사용하여 사용자 지정 호출 수행 방법

public class MyController : EntitySetController<Poco, int> 
{ 
    public IQueryable<Poco> Get() 
    { 
     var result = _myBusinessLogic.Search(QueryOptions.Top.Value); 
     return result.AsQueryable() 
    } 
} 

나는 컨트롤러가 이미 하나의 페이지를 반환 Search 방법의 결과에 페이징을 적용하려고하는 것처럼 보이기 때문에 내가 뭔가를 놓친 것 같아. 어떻게하면 그 일을 막고 페이징을 직접 적용 할 수 있습니까?

public IEnumerable<Poco> Get(ODataQueryOptions odataQueryOptions) 

을하지만 쓰기 적은 배관 코드가 거기에 너무 EntitySetController 함께있을 수 있는지 궁금 : 난 그냥 대신 ODataController에서 상속 구현할 수처럼

는 것 같습니다.

나는 PageResult<>

답변

1

에만 ODataQueryOptions를 사용하여 쿼리의 모든 권한을하거나 프레임 워크는 QueryableAttribute 사용에 대한 완전히 처리 할 수있는 하나로, OData 형식에 충실하지 반환 싶었다. 불행히도 중도는 없습니다.

ODataController를 수행하는 것이 지금 이것을 해결하는 올바른 방법이라고 생각합니다.

즉, 당분간 효과가있는 더러운 해결 방법을 제안 할 수 있습니다. 이것은 당신을 바꿀 수도, 해할 수도있는 내부 구현에 의존한다는 것을 알아 두십시오.

public class MyController : EntitySetController<Poco, int> 
{ 
    public IQueryable<Poco> Get() 
    { 
     var result = _myBusinessLogic.Search(QueryOptions.Top.Value); 
     RemoveQueryString(Request, "$top"); 
     return result.AsQueryable() 
    }  

    // This method relies that code that looks for query strings uses the extension 
    // method Request.GetQueryNameValuePairs that relies on cached implementation to 
    // not parse request uri again and again. 
    public static void RemoveQueryString(HttpRequestMessage request, string name) 
    { 
     request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = request.GetQueryNameValuePairs().Where(kvp => kvp.Key != name); 
    } 
} 
관련 문제