使用OData QueryableAttribute修改从ASP.NET Web API返回的响应内容

Bre*_*use 5 c# entity-framework odata asp.net-web-api

这是我的问题.我正在使用ASP.NET Web API 2.0和QueryableAttribute来利用一些OData过滤功能.

public class VideoController : ApiController
{
    [HttpGet]
    [Route("activevideos")]
    [Queryable]
    public IEnumerable<Video> GetActiveVideos(ODataQueryOptions<Video> options)
    {
        return new GetvContext().Videos.Where(c => c.IsActive);
    }        
}
Run Code Online (Sandbox Code Playgroud)

现在,我有一个我一直用来修改响应对象和包含实体的类.在我开始使用QueryableAttribute之前,这工作正常.在此之前,我从前一个方法而不是IEnumerable返回一个List.

public class TestMessageProcessHandler : MessageProcessingHandler
{
    protected override HttpResponseMessage ProcessResponse(
        HttpResponseMessage response, CancellationToken cancellationToken)
    {

        var content = ((ObjectContent)(response.Content)).Value;
        // Do something here with the content.  This used to be a List<Video> 
        // but now the object it is of type: 
        // System.Data.Entity.Infrastructure.DbQuery<System.Web.Http.OData.Query.Expressions.SelectExpandBinder.SelectSome<Content.Api.Video>>
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要能够从这个获取实体,我不知道如何从类型中获取:

System.Data.Entity.Infrastructure.DbQuery<System.Web.Http.OData.Query.Expressions.SelectExpandBinder.SelectSome<Content.Api.Video>>这样的东西List<Video>,我可以修改Video对象.

quj*_*jck 1

删除该[Queryable]属性并自行管理数据查询 - 如下所示:

public class VideoController : ApiController
{
    [HttpGet]
    [Route("activevideos")]
    public IList<Video> GetActiveVideos(ODataQueryOptions<Video> options)
    {
        var s = new ODataQuerySettings() { PageSize = 1 };
        var result = options.ApplyTo(
            new GetvContext().Videos.Where(c => c.IsActive), s)
            .ToList();

        return result;
    }        
}
Run Code Online (Sandbox Code Playgroud)

  • 一个问题是,对从 `options.ApplyTo()` 返回的对象调用 ToList() 将无法编译。无法推断类型参数。我也不能这样做: `var result = options.ApplyTo(new GetvContext().Videos.Where(c =&gt; c.IsActive), s).AsQueryable().Cast&lt;Video&gt;().ToList();`因为它无法将“SelectSome”1[Content.Api.Video]”类型的对象转换为“Content.Api.Video”类型(SelectSome &lt;&gt;是OData库中的私有类) (3认同)