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

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

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

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

{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 существует только для тех атрибутов, которые относятся к типу Lookup, поэтому выбор этого столбца из строкового атрибута завершится ошибкой и вызовет эту ошибку.

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

$ фильтр, $ inlinecount, $ orderby, $ skiptoken, $ skip, $ top, $ expand, $ select, $ format

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

1 Ответ

0 голосов
/ 17 января 2019

Для получения искомых объектов вам может повезти, если вы наберете $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","MetadataId":"2a712c96-09b1-e811-a842-000d3a33bdbd"},{"ReferencingAttribute":"preferredequipmentid","ReferencedEntity":"equipment","MetadataId":"b4b462b5-ee78-467d-a97a-45264d234816"},{"ReferencingAttribute":"primarycontactid","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-8655-530bba050765"},{"ReferencingAttribute":"createdbyexternalparty","ReferencedEntity":"externalparty","MetadataId":"9967fe7d-84ee-4a26-9ad7-a8fdbdfa2316"},{"ReferencingAttribute":"modifiedby","ReferencedEntity":"systemuser","MetadataId":"8be02a9d-0776-4c76-b35f-1c92dd791d9e"},{"ReferencingAttribute":"parentaccountid","ReferencedEntity":"account","MetadataId":"57511732-b553-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' была указана несколько раз, но она должна быть указывается не более одного раза. "

...