最新の ASP.Net WebAPI Nightly ビルド (2013 年 1 月 16 日付け) を使用しています。
現時点では、患者と訪問の 2 つのエンティティを持つ単純な EF データベースの最初のモデルがあります。一人の患者さんは何回も通うことができます。
患者のリストを照会して、各患者の訪問エンティティをインラインで返すことができるようにしたいと考えています。WebAPI の OData 実装がまだ $expand をサポートしていないことは知っています。オプションのクライアント制御の拡張がサポートされておらず、サーバー側で拡張を強制できることを意味していることを願っています。
現時点では、訪問をインラインで取得していません。
たとえば、PatientController の() Get() メソッドは次のようになります。
[Queryable(AllowedQueryOptions=AllowedQueryOptions.Supported)]
public override IQueryable<Patient> Get()
{
var query = this.entities.Patients.Include("Visits");
return query;
}
データベースに対して実行されているクエリに実際に訪問情報が含まれていることを確認しました。
公開されている OData サービスを例として使用するには、http://services.odata.org/OData/OData.svc/でサービスを使用すると、サプライヤーのリストを取得できます。これはhttp://http://services.odata.org/OData/OData.svc/Suppliersです。http://http://services.odata.org/OData/OData.svc/Suppliers?$expand=Productsを使用して、製品のリストを含むサプライヤーのリストを要求することもできます。
(シンボル サーバー経由で) ASP.NET コードをステップ実行すると、System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer が表示され、シリアル化するプロパティのリストを作成する CreatePropertyBag メソッドであることがわかります。 、ナビゲーション プロパティが含まれていないだけで、NavigationLinks として書き出されることを除いて、他の場所に列挙されていないようです。
私は一般的にASP.NETの世界にまったく慣れていないので、1週間ほどかけて物事の仕組みを理解しました(特に、2012年末にODataに加えられた変更と、2013年にこれまでに加えられたさらなる変更)。 .
ODataEntityTypeSerializer を変更して (喜んで試してみます)、この追加情報を適切な場所 (ネストされたインライン フィードとして各ナビゲーション リンク内にあることがわかります) に埋め込む場合は、設定されると思います。
質問:
明らかなことを見落としていて、この動作をオンにするために設定できるフラグがありますか? そのようなフラグが存在する場合、デフォルトでオフになる理由がわかります(EF遅延読み込みとこのフラグはうまくいきません)
#1 が「いいえ」の場合、他に使用できる ODataEntityTypeSerializer はありますか? もしそうなら、どうすればそれに切り替えることができますか?
#2がいいえの場合、自分で書き始めるべき場所へのポインタはありますか? 自分のシリアライザーで代用できる場所はありますか、それとも ASP.NET の拡張プロジェクト (ランタイム プロジェクトではなく) の独自のフォークを維持する必要がありますか?
どうもありがとう!