Фильтрация OData перед выбором внутри расширенного запроса

Я пишу запрос метаданных в Dynamics 365, но думаю, что эта проблема может быть универсальной для любого запроса OData.

Моя проблема заключается в следующем:

В Dynamics у нас может быть несколько типов полей в объектах, таких как строки, логические значения или поиск. Я хочу написать запрос, который возвращает тип объекта, к которому обращается поиск.

{url}/api/data/v9.0/EntityDefinitions(LogicalName='Account')
?$select=
    LogicalName
&$expand=
    Attributes(
        $select=
            LogicalName,
            AttributeType,
            Targets; -- Problematic property
        $filter=
      AttributeType+eq+Microsoft.Dynamics.CRM.AttributeTypeCode'Lookup')

Если я не включу в этот запрос выбор для целей, я получу правильный результат, поскольку это будут все атрибуты, для которых AttributeType является Lookup.

Но когда я требую, чтобы цели были включены, я получаю сообщение об ошибке

Could not find a property named 'Targets' on type 'Microsoft.Dynamics.CRM.AttributeMetadata

Поскольку свойство Target существует только для тех arrribute, которые относятся к типу Lookup, выбор этого столбца из строкового атрибута завершится ошибкой и вызовет эту ошибку.

Есть ли способ сначала отфильтровать результаты поиска перед выбором столбца? Я нашел здесь, что порядок оценки

$ filter, $ inlinecount, $ orderby, $ skiptoken, $ skip, $ top, $ expand, $ select, $ format

это именно то, что мне нужно, за исключением того, что я не думаю, что этот порядок будет таким же при вызове внутри атрибута $ expand.


person Metju.Perry    schedule 16.01.2019    source источник


Ответы (2)


Для получения объектов поиска вам, возможно, повезет больше, если вы выполните $expand на ManyToOneRelationships вместо Attributes и получите значение ReferencedEntity.

ManyToOne

Примерно так должно работать:
.../api/data/v9.1/EntityDefinitions(LogicalName='account') ?$select=LogicalName &$expand=ManyToOneRelationships($select=ReferencingAttribute,ReferencedEntity)

Подмножество результатов:

{"@ odata.context": "https://myOrg.api.crm.dynamics.com/api/data/v9.1/ $ metadata # EntityDefinitions (LogicalName, ManyToOneRelationships (ReferencingAttribute, ReferencedEntity)) / $ entity "," LogicalName ":" account "," MetadataId " : "70816501-edb9-4740-a16c-6a5efbc05d84", "ManyToOneRelationships": [{"ReferencingAttribute": "msdyn_accountkpiid", "ReferencedEntity": "msdyn_accountkpiitem" -12c8da1000: "ab11da7" -b11da1dda7: "метаданные" -данные }, {"ReferencingAttribute": "Preferredequipmentid", "ReferencedEntity": "equipment", "MetadataId": "b4b462b5-ee78-467d-a97a-45264d234816"}, {"ReferencingAttribute": "primarycontactidEntity", "ReferencedEntity": contact "," MetadataId ":" 410707b1-9554-4cd9-8437-6608b1802904 "}, {" ReferencingAttribute ":" masterid "," ReferencedEntity ":" account "," MetadataId ":" 51fa4af7-93d0-4f06-8949- 38a0036ddc64 "}, {" ReferencingAttribute ":" preferredsystemuserid "," ReferencedEntity ":" systemuser "," MetadataId ":" a6b48e23-fada-4b7f-86 55-530bba050765 "}, {" ReferencingAttribute ":" createdbyexternalparty "," ReferencedEntity ":" externalparty "," MetadataId ":" 9967fe7d-84ee-4a26-9ad7-a8fdbdfa2316 "}, {" ReferencingAttribute ":" изменено ReferencedEntity ":" systemuser "," MetadataId ":" 8be02a9d-0776-4c76-b35f-1c92dd791d9e "}, {" ReferencingAttribute ":" parentaccountid "," ReferencedEntity ":" account "," MetadataId "-5755511732 4cfb-bcf2-d280f9f8c6f1 "}, {" ReferencingAttribute ":" entityimageid "," ReferencedEntity ":" imagedescriptor "," MetadataId ":" 5b4942d5-1fcd-49ca-91c0-2737f5f104f3 "},

Кроме того, для справки, я попытался выполнить $expand Атрибуты И Цели:
../api/data/v9.1/EntityDefinitions(LogicalName='account')?$select=LogicalName&$expand=Attributes($filter=AttributeType+eq+Microsoft.Dynamics.CRM.AttributeTypeCode%27Lookup%27&$expand=Targets)

Выдает ошибку:

«Параметр запроса '$ expand' был указан более одного раза, но он должен быть указан не более одного раза».

person Aron    schedule 17.01.2019
comment
Привет, спасибо за ответ. Расширение метаданных очень помогает. Я пытался специально вызвать конечную точку метаданных, но мне не приходило в голову, что вы можете расширить отношения вместо атрибутов. Этот запрос сделал свое дело. Также для справки: я пишу что-то, что получает все данные, которые программе необходимо сопоставить, то есть загружать значения из поисковых запросов. Мне пришлось реализовать логику, чтобы разделить это на несколько вызовов, в частности, потому что Dynamics ограничен одним вызовом расширения за раз. - person Metju.Perry; 18.01.2019

Можно развернуть Attributes и ManyToOneRelationships в одном вызове, если вы разделите их запятой.

GET https://{{baseUrl}}/api/data/v9.1/EntityDefinitions(LogicalName='account')?$select=LogicalName,EntitySetName&$expand=Attributes($select=LogicalName),ManyToOneRelationships($select=ReferencingAttribute,ReferencedEntity)
person Guillaume Simard    schedule 06.08.2020