使用odata函数isof与web api

时间:2013-06-26 02:02:23

标签: .net asp.net-web-api odata

我正在使用带有web api的OData并尝试根据类型细节进行查询。我想要的是提供一个看起来像这样的查询(粗体文本在语法上不正确,但描述了断言类型后我想要做的事情):

../ Supplier?$ filter = isof(Product,namespace.ToyProduct) & Product.ratedAge eq 5

然而,当我尝试使用[Queryable]属性并继承自ODataController时,我得到一个关于isof的方法不支持错误。有没有办法让方法得到支持?我已经尝试将AllowedFunctions.All添加到Queryable属性,但这不起作用。

我能够使用ODataQueryOptions来检查isof是否包含在过滤器中并使用我自己的方法进行检查,但它相当混乱,并且在允许额外过滤之后可能会变得更糟,如果存在更好的解决方案那将是非常棒的!

目前的未编译代码:

public class SupplierController : ODataController {
    [Queryable(AllowedFunctions = AllowedFunctions.All)]
    public PageResult<Supplier> Get(ODataQueryOptions<Supplier> queryOptions) {

        // doesn't work, method not supported
        //var queryableSuppliers = queryOptions.ApplyTo(_repository.All());  

        // works but messy method.
        var queryableSuppliers = MyIsOfMethod(queryOptions.Filter) 

        return new PageResult<ObjectType>(
            results as IEnumerable<ObjectType>,
            Request.GetNextPageLink(),
            Request.GetInlineCount());

    }
} 

2 个答案:

答案 0 :(得分:1)

我们不支持web api中的isof和cast函数。我们使用单独的段来支持新的强制转换语法。使用新语法

,您的查询将如下所示

../Supplier?$filter=Product/namespace.ToyProduct/ratedAge eq 5

答案 1 :(得分:1)

我不认为答案与问题相符。 有问题的原始查询是:

../Supplier?$filter=isof(Product, namespace.ToyProduct)&Product.ratedAge eq 5 

我想这实际上意味着:

../Supplier?$filter=isof(Product, namespace.ToyProduct)%20and%20Product.ratedAge eq 5 

无论如何,它是过滤器来检索特定派生类型或其子类型中的实体。 答案不是那样做的。