【问题标题】:Possible to manually apply OData parameters to result of `.AsQueryable()`?可以手动将 OData 参数应用于“.AsQueryable()”的结果吗?
【发布时间】:2013-01-06 19:55:16
【问题描述】:

我有一个返回 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();
    }
}

但是,就像this poster 一样,我想让 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。

【问题讨论】:

    标签: asp.net entity-framework-4 asp.net-mvc-4 asp.net-web-api odata


    【解决方案1】:

    您可以添加一个 ODataQueryOptions 类型的参数并手动应用它,而不是将您的操作标记为 [Queryable]。下面是它的样子:

    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 };
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2014-12-03
      • 1970-01-01
      • 2011-12-29
      • 2010-09-17
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多