2

この優れた投稿で説明されているように、型指定されていないエンティティ オブジェクトを処理する WebAPI OData ソリューションを構築しています。その投稿のように、事前に EdmModel を定義し、MapODataRoute メソッドを使用して、使用するモデルを渡します。

config.Routes.MapODataRoute("odata", "odata", ModelBuilder.GetEdmModel());

ただし、これは私のメソッドの ODataQueryOptions パラメータでは機能しないようです:

Get(ODataQueryOptions query)
{
}

次のエラーが表示されます:指定されたモデルには、型 'System.Web.Http.OData.IEdmEntityObject' が含まれていません。パラメータ名: elementClrType

ODataQueryOptions を MapODataRoute と連携させる方法はありますか?

4

2 に答える 2

4

型指定なしモードのコントローラー アクションで ODataQueryOptions を手動で作成する必要があります。サンプルコードは次のとおりです。

ODataPath path = Request.GetODataPath();
IEdmType edmType = path.EdmType;

IEdmType elementType = edmType.TypeKind == EdmTypeKind.Collection 
    ? (edmType as IEdmCollectionType).ElementType.Definition 
    : edmType;

// build the typeless query options using the element type.
ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), elementType);
ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, Request);
于 2013-11-13T23:58:45.827 に答える
0

私は次のようにそれを行うことができました:

ODataPath path = Request.GetODataPath();
IEdmType edmType = path.EdmType;   

private ODataQueryOptions GetODataQueryOptions(IEdmType edmType)
    {
        IEdmModel model = Models.ModelBuilder.GetEdmModel();
        ODataQueryContext queryContext = new ODataQueryContext(model, edmType);
        ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, this.Request);

        return queryOptions;
    }

これはほとんどのクエリ オプションで機能しますが、$select と $expand でクラッシュします:タイプ 'Collection([Org.Microsoft.Product Nullable=False])' はエンティティ タイプではありません。エンティティ タイプのみが $select と $expand をサポートします。クライアントが $select と $expand でフィルタリングしようとしたときに、この例外を適切に回避する方法はありますか?

if (Request.RequestUri.Query.Contains("select")) { return errormessage }

また、さらに重要なことに、これらのクエリ オプションを、最初のメソッドで返されるEdmEntityObjectCollectionにどのように適用しますか?

queryOptions.ApplyTo(collectionProduct.AsQueryable()); // wont work...

(とにかく、クエリ オプションに関してコレクションを動的に構築することをお勧めします)

于 2013-11-14T08:24:37.560 に答える