3

我有一個MVC4 WebAPI控制器,返回一個IQueryable,因此我可以使用$filter和URL中的朋友來處理來自REST端點的結果。這裏是我的控制器:可能手動將OData參數應用於`.AsQueryable()`的結果?

public class EnrollmentController : ApiController 
{ 
    [Queryable] 
    public IQueryable<tblEnrollment> Get() 
    { 
     var context = new ProjectEntities(); 
     context.ContextOptions.LazyLoadingEnabled = false; 
     return context.tblEnrollment.AsQueryable(); 
    } 
} 

但是,像this poster,我想使JSON輸出格式有一點不同是與Ember數據的預期格式友好。所以我想,而不是返回此:

return new { enrollment = context.tblEnrollment.AsQueryable() }; 

然而,打破OData的能力,因爲我沒有返回IQueryable到的WebAPI層。所以,我想知道是否有一種方法可以做這樣的事情:

return new { enrollment = context.tblEnrollment.AsQueryable().ApplyOData() }; 

,我相信會的方式來好得令人難以置信......但有一些方法來明確處理的OData參數而不是讓WebAPI圖層在Get方法返回的結果集上隱式地執行該操作,而不是使用IQueryable?還是有另一種方法來完成我想要的東西嗎?順便說一下,我暫時停留在EF4上,因爲我無法升級到VS2012(因此無法升級到.NET4.5和EF5)。理論上我可以升級到EF 4.3.1,如果有幫助的話。

回答

3

您可以添加一個ODataQueryOptions類型的參數並手動應用它,而不是將您的操作標記爲[可查詢]。以下是它的外觀:

public class EnrollmentController : ApiController 
{ 
    public object Get(ODataQueryOptions<tblEnrollment> query) 
    { 
     var context = new ProjectEntities(); 
     context.ContextOptions.LazyLoadingEnabled = false; 
     var queryResults = query.ApplyTo(context.tblEnrollment.AsQueryable()); 
     return new { enrollment = queryResults }; 
    } 
} 
相關問題