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 回答