可以手动将 OData 参数应用于 '.AsQueryable()'.



我有一个返回IQueryable的MVC4 WebAPI控制器,因此我可以在URL中使用$filter和朋友来操作来自REST端点的结果。这是我的控制器:

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

但是,就像这张海报一样,我想使 JSON 输出格式略有不同,以便与 Ember Data 的预期格式更友好。所以我想返回这个:

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

但是,这会破坏 OData 功能,因为我没有将IQueryable返回到 WebAPI 层。所以,我想知道是否有办法做这样的事情:

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

我敢肯定,这将是真的好方法...但是有没有办法针对IQueryable显式处理 OData 参数,而不是让 WebAPI 层在从Get方法返回的结果集上隐式处理?还是有另一种方法可以在这里完成我想要的?

顺便说一句,我暂时停留在EF4上,因为我无法升级到VS2012(因此无法升级到.NET4.5 和 EF5)。理论上我可以升级到EF 4.3.1,如果它有帮助的话。

您可以添加 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 };
    }
}

最新更新