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() メソッドは最新のナイトリー ビルドには存在しないことに注意してください。
どうもありがとう!