Невозможно получить не общие записи - PullRequest
3 голосов
/ 19 марта 2019

У меня есть сценарий, чтобы найти записи, которые не передаются команде доступа.

QueryExpression query = new QueryExpression("task")
        {
            ColumnSet = new ColumnSet("activityid", "subject", "customid"),
            Criteria = new FilterExpression()
            {
                Conditions =
                {
                    new ConditionExpression("customid", ConditionOperator.NotNull)
                }
            },
            LinkEntities =
            {
                new LinkEntity("task", "principalobjectaccess", "activityid", "objectid", JoinOperator.Inner)
                {
                    Columns = new ColumnSet(true),
                    EntityAlias = "POA",
                    LinkCriteria = new FilterExpression()
                    {
                        Conditions =
                        {
                            new ConditionExpression("principaltypecode", ConditionOperator.NotEqual, "team")
                        }
                    }
                }
            }
        };

Результат содержит записи, которые являются общими и недоступными.

Principaltypecode значение содержит либо SystemUser, либо Team, в моем сценарии я ожидаю записи, которые не передаются какой-либо команде.

Обновление: У XrmToolBox есть один плагин, который помог мне найти неразделенные записи.

enter image description here

enter image description here

У этого плагина есть ответ на мой вопрос, но для этого мне нужен код на C #. Кто-нибудь знает механизм этого инструмента для поиска таких записей?

Ответы [ 3 ]

0 голосов
/ 19 марта 2019

Я проверил базу данных и PrincipleTypeCode представляет собой ObjectTypeCode , сохраненный как int, а не string.

principalTypeCode

8 - код типа объекта для SystemUser
9 - код типа объекта для Team

principaltypecode никогда не должен совпадать с "командой", поэтому текущий запрос возвращает все.

Возможно, вы захотите попробовать:
new ConditionExpression("principaltypecode", ConditionOperator.NotEqual, 9)

0 голосов
/ 19 марта 2019

Раствор 1

Выполните левое внешнее соединение между таблицей Task и POA, получая только столбец acitivityId и столбец Principaltypecode:

        var query = new QueryExpression("task");

        var principalObjectAccess = query.AddLink("principalobjectaccess", "activityid", "objectid", JoinOperator.LeftOuter);

        principalObjectAccess.Columns.AddColumns("principaltypecode");

        var entityCollection = _service.RetrieveMultiple(query);

Затем выполните фильтрацию в оперативной памяти, чтобы удалить все записи в коллекции, где принципал основного типа равен команде. Помните, что если вы найдете Id, который удовлетворяет этому условию, вы должны удалить все записи с этим Id, важно удалить задачи, которые являются общими как для пользователя, так и для команды.

Решение 2

Этот запрос даст вам все задачи, которые передаются команде:

        var teamPrincipalTypeCode = 9;

        var query = new QueryExpression("task");

        var principalObjectAccess = query.AddLink("principalobjectaccess", "activityid", "objectid");

        principalObjectAccess.LinkCriteria.AddCondition("principaltypecode", ConditionOperator.Equal, teamPrincipalTypeCode);

        var entityCollection = _service.RetrieveMultiple(query);

После его запуска вам просто нужно запросить все руководства по задачам и вычесть те, которые были возвращены в результате запроса выше. Вы можете легко сделать это, используя метод Except из пространства имен System.Linq.

0 голосов
/ 19 марта 2019

У вас нет прямого способа получить записи, которые не являются общими. Но то, что вы могли бы сделать, это

  1. Получите основной объект доступа, где в отношении Записи находится Аккаунт или контакт и т. Д.
  2. Таким образом, вы будете иметь все учетные записи / контакты, которые являются общими.
  3. Теперь выполните итерацию по всем Аккаунтам / Контактам и проверьте, совпадают или нет идентификаторы, которые вы извлекли из mainobjectaccess
  4. Таким образом, вы можете получить список или учетную запись / контакт (записи), которые не являются общими

    enter image description here

...