Фильтр выражения запроса Dynamics CRM или условие для двух связанных сущностей

В настоящее время я пытаюсь получить всех пользователей системы, которым назначена определенная роль безопасности или назначена команде, у которой есть роль безопасности. при построении запроса кажется, что они фильтруются только по условию and при написании запроса таким образом:

QueryExpression RolesQuery = new QueryExpression
        {
            EntityName = "systemuser",
            ColumnSet = new ColumnSet("systemuserid"),
            Distinct = true,
            Criteria =
            {
                Filters =
                {
                    new FilterExpression
                    {
                        FilterOperator = LogicalOperator.And,
                        Conditions =
                        {
                            new ConditionExpression("isdisabled", ConditionOperator.Equal, "0")
                        }
                    }
                }
            },
            LinkEntities =
            {
                new LinkEntity
                {
                    LinkFromEntityName = "systemuser",
                    LinkToEntityName = "systemuserroles",
                    LinkFromAttributeName = "systemuserid",
                    LinkToAttributeName = "systemuserid",
                    LinkCriteria =
                    {
                        Filters =
                        {
                            new FilterExpression
                            {
                                FilterOperator = LogicalOperator.And,
                                Conditions =
                                {
                                    new ConditionExpression("roleid", ConditionOperator.Equal, "00000000-0000-0000-0000-000000000000")
                                }
                            }
                        }
                    }
                },
                new LinkEntity
                {
                    LinkFromEntityName = "systemuser",
                    LinkToEntityName = "teammembership",
                    LinkFromAttributeName = "systemuserid",
                    LinkToAttributeName = "systemuserid",
                    LinkEntities =
                    {
                        new LinkEntity
                        {
                            LinkFromEntityName = "teammembership",
                            LinkToEntityName = "team",
                            LinkFromAttributeName = "teamid",
                            LinkToAttributeName = "teamid",
                            LinkEntities =
                            {
                                new LinkEntity
                                {
                                    LinkFromEntityName = "team",
                                    LinkToEntityName = "teamroles",
                                    LinkFromAttributeName = "teamid",
                                    LinkToAttributeName = "teamid",
                                    LinkCriteria =
                                    {
                                        Filters =
                                        {
                                            new FilterExpression
                                            {
                                                FilterOperator = LogicalOperator.And,
                                                Conditions =
                                                {
                                                    new ConditionExpression("roleid", ConditionOperator.Equal, "00000000-0000-0000-0000-000000000000")
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                        }
                    }
                }
            }
        };

Мой вопрос: есть ли способ применить фильтр or к двум связанным объектам?

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


person Brad Sturgess    schedule 21.04.2017    source источник


Ответы (1)


Нет, невозможно обернуть LinkEntity соединения в FilterExpression.

На самом деле, в отношении ссылочных объектов возможности фильтрации QueryExpression весьма ограничены. Например. вы не можете запрашивать записи, которые не имеют связанных записей определенного типа сущности.

person Henk van Boeijen    schedule 21.04.2017
comment
Ваш пример неверен, вы можете запросить такие записи, используя внешнее соединение: msdn. microsoft.com/en-us/library/dn531006.aspx. Пример для FetchXML, но, конечно, любой fetchXML можно преобразовать в QueryExpression. - person Pawel Gradecki; 22.04.2017
comment
@PawelGradecki Левые внешние соединения поддерживаются, но невозможно получить только левую сторону без ассоциаций на правой стороне. - person Henk van Boeijen; 22.04.2017
comment
левое внешнее соединение позволяет сделать именно это. Например, получение всех учетных записей (слева) без каких-либо связанных с ними возможностей (справа). Или может я неправильно понял ваш пост? - person Pawel Gradecki; 23.04.2017
comment
Хенк, именно этот сценарий демонстрирует ссылка @Pawel. Атрибут entityname (ConditionExpression.EntityName в терминах QueryExpression) доступен с CRM 2013. - person anton.burger; 09.05.2017