字段明明存在,用Web API使用该字段进行查询报错?

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复369或者20190923可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

今天我测试一下,Dynamics 365 Customer Engagement V9.X版本这个问题不存在了,对于V8.X还是存在的,我至少见过两例。

我这里举个碰到的例子,有的人给实体建立字段的时候,字段的名字和实体名字相同。比如我这里测试实体的逻辑名称叫 ly_test 。

我建立了一个字段,逻辑名称也叫 ly_test。

然后我用Web API显示第一条记录,看到这个字段也在。

然后我用这个字段来构造查询条件看看,例如 $filter=ly_test eq null ,可以看到V9.X版本的Dynamics 365 Customer Engagement已经不报错了。

 但是如果是V8.X会报错:

{
  "error":{
    "code":"","message":"Could not find a property named 'ly_test' on type 'Microsoft.Dynamics.CRM.ly_test'.","innererror":{
      "message":"Could not find a property named 'ly_test' on type 'Microsoft.Dynamics.CRM.ly_test'.","type":"Microsoft.OData.Core.ODataException","stacktrace":"   \u5728 Microsoft.OData.Core.UriParser.Parsers.EndPathBinder.GeneratePropertyAccessQueryForOpenType(EndPathToken endPathToken, SingleValueNode parentNode)\r\n   \u5728 Microsoft.OData.Core.UriParser.Parsers.EndPathBinder.BindEndPath(EndPathToken endPathToken)\r\n   \u5728 Microsoft.OData.Core.UriParser.Parsers.MetadataBinder.Bind(QueryToken token)\r\n   \u5728 Microsoft.OData.Core.UriParser.Parsers.BinaryOperatorBinder.GetOperandFromToken(BinaryOperatorKind operatorKind, QueryToken queryToken)\r\n   \u5728 Microsoft.OData.Core.UriParser.Parsers.BinaryOperatorBinder.BindBinaryOperator(BinaryOperatorToken binaryOperatorToken)\r\n   \u5728 Microsoft.OData.Core.UriParser.Parsers.MetadataBinder.Bind(QueryToken token)\r\n   \u5728 Microsoft.OData.Core.UriParser.Parsers.FilterBinder.BindFilter(QueryToken filter)\r\n   \u5728 Microsoft.OData.Core.UriParser.ODataQueryOptionParser.ParseFilterImplementation(String filter, ODataUriParserConfiguration configuration, IEdmType elementType, IEdmNavigationSource navigationSource)\r\n   \u5728 Microsoft.OData.Core.UriParser.ODataQueryOptionParser.ParseFilter()\r\n   \u5728 System.Web.OData.Query.FilterQueryOption.get_FilterClause()\r\n   \u5728 Microsoft.Crm.Extensibility.OData.DataQueryOptionsConverter.SetFilterExpression(QueryExpression qe, FilterQueryOption filterQueryOption)\r\n   \u5728 Microsoft.Crm.Extensibility.OData.QueryOptionsConverterBase`4.GetQueryExpression(ODataQueryOptions queryOptions, String edmEntityName, CrmODataExecutionContext context)\r\n   \u5728 Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.RetrieveEdmEntityCollection(CrmODataExecutionContext context, String entityCollectionName, String castedEntityName, ODataQueryOptions queryOptions)\r\n   \u5728 Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySetInternal(String entitySetName, String castEntityName, CrmODataExecutionContext context, CrmEdmEntityObjectCollection crmEdmEntityObjectCollection, ODataQueryOptions queryOptions)\r\n   \u5728 Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySet(String entitySetName)\r\n   \u5728 lambda_method(Closure , Object , Object[] )\r\n   \u5728 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   \u5728 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- \u5f15\u53d1\u5f02\u5e38\u7684\u4e0a\u4e00\u4f4d\u7f6e\u4e2d\u5806\u6808\u8ddf\u8e2a\u7684\u672b\u5c3e ---\r\n   \u5728 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   \u5728 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   \u5728 System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- \u5f15\u53d1\u5f02\u5e38\u7684\u4e0a\u4e00\u4f4d\u7f6e\u4e2d\u5806\u6808\u8ddf\u8e2a\u7684\u672b\u5c3e ---\r\n   \u5728 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   \u5728 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   \u5728 System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- \u5f15\u53d1\u5f02\u5e38\u7684\u4e0a\u4e00\u4f4d\u7f6e\u4e2d\u5806\u6808\u8ddf\u8e2a\u7684\u672b\u5c3e ---\r\n   \u5728 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   \u5728 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   \u5728 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
    }
  }
}

你会问怎么办?其实很简单,你不用这个字段做筛选条件看下第一条就知道,原来返回的时候自动为这个与实体逻辑名称相同的字段加了一个1,也就是会变成 ly_test1,那么你做筛选的时候就要改一下名字,用 ly_test1,这样就不会有问题了。

当然如果你的系统升级的话,比如从V8.X升级到V9.X就会掉这个坑里了,V9.X已经可以了,不会自动在后面加1了,你代码不改话,使用Web API获取或者查询使用该字段就会报错。

所以我这里的忠告是,字段的名称不要和实体的名称相同!

猜你喜欢

转载自www.cnblogs.com/luoyong0201/p/Dynamics_365_Do_Not_Set_Field_Name_Same_As_Entity_Name.html
今日推荐