Asp.net web api Web Api OData v3-Cast或IsOf函数的参数中必须有一个类型

Asp.net web api Web Api OData v3-Cast或IsOf函数的参数中必须有一个类型,asp.net-web-api,odata,Asp.net Web Api,Odata,我有一个基本实体(Store),还有两个实现它的其他类型(Customer,Engineer) 但是,当我尝试筛选某一类型时: http://localhost:50050/odata/Store?$inlinecount=allpages&$top=20&$filter=isof(MyNamespace.Data.Core.Entities.Engineer)&$orderby=Name%20asc 我得到这个错误: { "odata.error":{ "

我有一个基本实体(
Store
),还有两个实现它的其他类型(
Customer
Engineer

但是,当我尝试筛选某一类型时:

http://localhost:50050/odata/Store?$inlinecount=allpages&$top=20&$filter=isof(MyNamespace.Data.Core.Entities.Engineer)&$orderby=Name%20asc
我得到这个错误:

{
  "odata.error":{
    "code":"","message":{
      "lang":"en-US","value":"The query specified in the URI is not valid. Cast or IsOf Function must have a type in its arguments."
    },"innererror":{
      "message":"Cast or IsOf Function must have a type in its arguments.","type":"Microsoft.Data.OData.ODataException","stacktrace":"   at Microsoft.Data.OData.Query.FunctionCallBinder.ValidateIsOfOrCast(BindingState state, Boolean isCast, List`1& args)\r\n   at Microsoft.Data.OData.Query.FunctionCallBinder.CreateUnboundFunctionNode(FunctionCallToken functionCallToken, List`1 args, BindingState state)\r\n   at Microsoft.Data.OData.Query.FunctionCallBinder.BindAsBuiltInFunction(FunctionCallToken functionCallToken, BindingState state, List`1 argumentNodes)\r\n   at Microsoft.Data.OData.Query.FunctionCallBinder.BindFunctionCall(FunctionCallToken functionCallToken, BindingState state)\r\n   at Microsoft.Data.OData.Query.MetadataBinder.BindFunctionCall(FunctionCallToken functionCallToken)\r\n   at Microsoft.Data.OData.Query.MetadataBinder.Bind(QueryToken token)\r\n   at Microsoft.Data.OData.Query.BinaryOperatorBinder.GetOperandFromToken(BinaryOperatorKind operatorKind, QueryToken queryToken)\r\n   at Microsoft.Data.OData.Query.BinaryOperatorBinder.BindBinaryOperator(BinaryOperatorToken binaryOperatorToken)\r\n   at Microsoft.Data.OData.Query.MetadataBinder.BindBinaryOperator(BinaryOperatorToken binaryOperatorToken)\r\n   at Microsoft.Data.OData.Query.MetadataBinder.Bind(QueryToken token)\r\n   at Microsoft.Data.OData.Query.FilterBinder.BindFilter(QueryToken filter)\r\n   at Microsoft.Data.OData.Query.ODataUriParser.ParseFilterImplementation(String filter, IEdmType elementType, IEdmEntitySet entitySet)\r\n   at System.Web.Http.OData.Query.FilterQueryOption.get_FilterClause()\r\n   at System.Web.Http.OData.Query.Validators.FilterQueryValidator.Validate(FilterQueryOption filterQueryOption, ODataValidationSettings settings)\r\n   at System.Web.Http.OData.Query.FilterQueryOption.Validate(ODataValidationSettings validationSettings)\r\n   at System.Web.Http.OData.Query.Validators.ODataQueryValidator.Validate(ODataQueryOptions options, ODataValidationSettings validationSettings)\r\n   at System.Web.Http.OData.Query.ODataQueryOptions.Validate(ODataValidationSettings validationSettings)\r\n   at System.Web.Http.OData.EnableQueryAttribute.ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)\r\n   at Vantage.Web.Api.Filters.AuthorizeQueryAttribute.ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions) in c:\\Users\\TimM\\Source\\Workspaces\\Workspace\\Vantage Web Prototype - API\\Vantage.Web.Api\\Filters\\AuthorizeQueryAttribute.cs:line 29\r\n   at System.Web.Http.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)\r\n   at System.Web.Http.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)"
    }
  }
}
为什么会发生这种情况?我使用了实体返回的确切类型

"odata.type":"MyNamespace.Data.Core.Entities.Engineer"

我使用的是Web Api 5.2.2、OData 5.3.1。谢谢你的帮助

您需要用单引号传递类型,如下所示:

http://localhost:50050/odata/Store?$inlinecount=allpages&$top=20&$filter=isof('MyNamespace.Data.Core.Entities.Engineer')&$orderby=Name%20asc
但是,如果执行此操作,将出现以下异常:

System.NotImplementedException: Unknown function 'isof'.
   at System.Web.Http.OData.Query.Expressions.FilterBinder.BindSingleValueFunctionCallNode(SingleValueFunctionCallNode node)
   at System.Web.Http.OData.Query.Expressions.FilterBinder.Bind(QueryNode node)
   at System.Web.Http.OData.Query.Expressions.FilterBinder.Bind(FilterClause filterClause, Type filterType, IEdmModel model, IAssembliesResolver assembliesResolver, ODataQuerySettings querySettings)
   at System.Web.Http.OData.Query.FilterQueryOption.ApplyTo(IQueryable query, ODataQuerySettings querySettings, IAssembliesResolver assembliesResolver)
   at System.Web.Http.OData.Query.ODataQueryOptions.ApplyTo(IQueryable query, ODataQuerySettings querySettings)
   at System.Web.Http.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)
   at System.Web.Http.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
当前版本的OData WebApi集成中不支持“isof”。您可以查看源代码。您会注意到stacktrace讨论了一个名为
BindSingleValueFunctionCallNode
的方法。其中有一个开关,具有以下
默认值
情况:

default:
throw new NotImplementedException(Error.Format(SRResources.ODataFunctionNotSupported, node.Name));
请注意,代码如何不测试是否存在
isof
cast
功能。在
CLRCononicalFunctionNames
类中,仅定义以下OData函数:

// function names
internal const string StartswithFunctionName = "startswith";
internal const string EndswithFunctionName = "endswith";
internal const string SubstringofFunctionName = "substringof";
internal const string SubstringFunctionName = "substring";
internal const string LengthFunctionName = "length";
internal const string IndexofFunctionName = "indexof";
internal const string TolowerFunctionName = "tolower";
internal const string ToupperFunctionName = "toupper";
internal const string TrimFunctionName = "trim";
internal const string ConcatFunctionName = "concat";
internal const string YearFunctionName = "year";
internal const string YearsFunctionName = "years";
internal const string MonthFunctionName = "month";
internal const string MonthsFunctionName = "months";
internal const string DayFunctionName = "day";
internal const string DaysFunctionName = "days";
internal const string HourFunctionName = "hour";
internal const string HoursFunctionName = "hours";
internal const string MinuteFunctionName = "minute";
internal const string MinutesFunctionName = "minutes";
internal const string SecondFunctionName = "second";
internal const string SecondsFunctionName = "seconds";
internal const string RoundFunctionName = "round";
internal const string FloorFunctionName = "floor";
internal const string CeilingFunctionName = "ceiling";

我目前正在尝试使用querystring参数实现我自己的
类型
过滤。

谢谢。微软没有实现这么多他们自己的OData规范,真是太遗憾了。你能让我了解最新情况吗?@Tim真是太遗憾了。我们做了一些设计决策,假设
isof
可以工作,现在我们必须添加一堆样板代码来手动工作。它在WCF数据服务中工作正常,我们广泛使用它。。。基本案例实际上很容易手工实现,因此如果您需要任何帮助,只需发布一个关于它的具体问题,我将很乐意尽力帮助您。每当微软更新这个以支持这些函数时,我都会是第一批修复代码以使用它们的人之一。我会尽量记得向你汇报的。是的,我也是。类继承实际上取决于能够在查询中分离它们,而现在我只剩下无法以标准化方式工作的查询。我通过为每种类型调用不同的控制器来解决这一问题。我意识到的另一个问题是,没有一个好方法可以只查看
存储
,而不获取继承的类型
客户
工程师
。让我觉得他们也需要更多的函数-
isnotof
,以及
isexactlyof
。我有一个解决方案,可以将
of type
调用emilt到查询中,以模拟
isof
函数。有关代码,请参见github.com/schungx/WebApi-OData。