6

ASP.Net WebAPI ナイトリー ビルド (2013-01-16) を使用して、最新の OData サポートを可能にしています。

MSDN OData 0.2.0-alpha リリースの投稿に関する Meta-Me ブログに記載されているように、EntitySetController<T>OData コントローラーを派生させて、多くの手間と配管コードを取り除くことができるようになりました。

EntitySetController<T>クラスは Get() を次のように実装します。

[Queryable]
public virtual IQueryable<TEntity> Get()
{
    throw EntitySetControllerHelpers.GetNotImplementedResponse(Request);
}

Get(ODataQueryOptions options)ASP.Net Web API OData サポートによって提供される、より具体的な方法を利用したいと思います。

私はそれを次のようにコーディングしました

public IEnumerable<Patient> Get(ODataQueryOptions options)
{
    IQueryable patients = entities.Patients;

    if (options.Filter != null)
    {
        patients = options.Filter.ApplyTo(patients, new ODataQuerySettings());
    }

    return (patients as IQueryable<Patient>).AsEnumerable();
}

(私もこれで IQueryable<> を返しましたが、他の誰かが ODataResult について話しているのを見ました。これは現時点では発見できないタイプです)。

ただし、自分のコントローラーで ODataQueryOptions ベースの Get メソッドを使用しようとすると、要求に一致する複数のアクションに関するエラー メッセージが表示されます。具体的にはそのエラーは

Multiple actions were found that match the request: 

System.Collections.Generic.IEnumerable`1[Dox.Server.Model.Patient] Get(System.Web.Http.OData.Query.ODataQueryOptions) on type Dox.Server.Web.Controllers.PatientController

System.Linq.IQueryable`1[Dox.Server.Model.Patient] Get() on type System.Web.Http.OData.EntitySetController`2[[Dox.Server.Model.Patient, Dox.Server.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

これは、コントローラーの基本クラスとコントローラー クラス自体で Get() または Get(...) を参照するルート リゾルバー (ASP.NET ルーティング用語が不適切である場合は申し訳ありません) が原因であると想定しています。

質問: a) これを修正するためにルートを調整する方法はありますか? b) そうでない場合、EntitySetController<T>Get() メソッドの独自のバージョンを作成して交換する必要がありますか?

Application_Start() によって呼び出される構成は、

public static void EnableOData( HttpConfiguration config )
{
    var model = BuildModelImplicitly(config);

    //As per LinqPad forum: http://forum.linqpad.net/discussion/178/odata-v3-not-working
    IEdmEntityContainer container = model.EntityContainers().First();
    model.SetIsDefaultEntityContainer(container, true);

    //config.EnableOData(model, "api");
    config.Routes.MapODataRoute("OData", "api", model);

    //config.EnableSystemDiagnosticsTracing();

}

ルートやハンドラーなどを処理するために呼び出されるその他の構成はありません。このCodePlex の説明によると、HttpConfiguration の EnableOData() メソッドは最新のナイトリー ビルドには存在しないことに注意してください。

どうもありがとう!

4

1 に答える 1

13

あなたが私たちのナイトリー ビルドを使っているのを見るのはとてもクールです :)

複数の一致するアクション エラーが発生する理由は、EntitySetController が既に Get メソッドを定義しているためです。幸いなことに、EntitySetController ではQueryOptions、クエリ オプションを取得するために使用できるプロパティも定義されています。したがって、EntitySetController の Get メソッドをオーバーライドして、パラメーターの代わりにクエリ オプション プロパティを使用できるはずです。クエリ オプションをアクション パラメータにバインドした場合とまったく同じように動作する必要があります。

于 2013-01-18T05:45:50.443 に答える