如何在 JS 中通过 Web API 从元数据中获取查找的实体类型

How to get the entity type of a lookup from MetaData via Web API in JS

在我的应用程序中,我有一个特定的实体类型 selected,并通过扩展 Attributes$expand=Attributes)。 对于'Lookup'AttributeType)类型的某个属性,我想知道相关实体的类型。因为属性请求包含每个属性的大量数据,我正在通过 selecting 一些属性来过滤扩展。不幸的是,似乎无法 select Targets 属性。因此,我必须要么请求所有数据(这很慢),要么我正在过滤并且不知道实体类型。

这是我的请求,在省略 Targets 时有效。

`EntityDefinitions?` +
    `$filter=EntitySetName eq '${entityTypeName}'&` +
    `$select=Attributes&` +
    `$expand=Attributes(` +
    `  $select=DisplayName,LogicalName,Targets` +
    `)`

是否可以select Targets 属性?

不同的解决方法

这些方法在我的用例中有其自身的缺点。

  1. 一次请求所有 RelationshipDefinitions 数据。它包含每个实体的所有必需品。接收到的数据很大,请求需要花费几秒钟的时间。因此,响应应该缓存在用户浏览器的 localStorage 中。仅通过必要的属性过滤请求似乎与 EntityDefinitions 类似。
  2. 请求 selected 实体的确切数据记录,其中特定查找不为空并包括注释 header,以便存在查找逻辑名称。这有一个缺点,即在系统中找不到这样的记录。请求数据记录而不是元数据也感觉不对。

示例:帐户实体,获取 primarycontactid 查找字段属性的实体类型。 Url、header 和响应:

http://SYSTEM_URL/ORGA_NAME/api/data/v8.2/accounts?$filter=primarycontactid ne null&$top=1
'Prefer': `odata.include-annotations="*"`
"_primarycontactid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "contact",
  1. 在 C# 中请求元数据并通过自定义操作从 JS 调用代码。

可以selectTargets

在为我的问题记下一些注释时,我发现有必要将属性转换为某个派生类型。在我的例子中,我将它转换为查找类型,LookupAttributeMetadata. Filtering by Targets is possible on the cast type, because the derived type contains the Targets property. The base type AttributeMetadata 没有。

响应将仅包含查找属性,仅包含属性 LogicalNameDisplayNameTargets

http://SYSTEM_URL/ORGA_NAME/api/data/v8.2/EntityDefinitions(LogicalName='account')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=Targets,LogicalName,DisplayName

这在此处有正式记录和解释:query-metadata-web-api