5

これが私の問題です。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);
    }        
}

これで、応答オブジェクトと含まれるエンティティを変更するために使用しているクラスができました。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>>
    }
}

これからエンティティを取得できるようにする必要がありますが、型から取得する方法がわかりません:

System.Data.Entity.Infrastructure.DbQuery<System.Web.Http.OData.Query.Expressions.SelectExpandBinder.SelectSome<Content.Api.Video>>List<Video>オブジェクトを変更できるようにしますVideo

4

3 に答える 3

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;
    }        
}
于 2013-10-24T15:00:30.533 に答える
0

ToList() を実行することはできませんか? DbQuery は IQueryable を実装しています...

例えば

var content = ((ObjectContent)(response.Content)).Value;
var queryable = content as IQueryable<Video>;
var list = queryable.ToList();
于 2014-03-09T04:36:55.547 に答える
0

ほとんどの場合、OData クエリでどのフィールドを選択する必要があるか (たとえば、$select=Nr,Date) を指定したために、この問題が発生しています。これを行わない場合、クエリ オプションを適用した後、OData はオブジェクトを返さず、SelectSomeクエリしているのと同じオブジェクトを返しますVideo。したがって、これらのオブジェクトをクライアントに返す前にサーバー側で簡単に変更できます。

また、不要なプロパティをVideoオブジェクトから除外する必要がある場合は、$selectクエリ オプションの代わりに、Videoオブジェクトの代わりに DTO を使用して、必要なフィールドのみをこの DTO に含めることができます。

はい、これは回避策です。このライブラリの将来のバージョンでサーバー側のロジックを処理するためのより良い手段があることを願っています

于 2015-11-24T13:33:16.450 に答える