QueryExpression без результатов в подключаемом модуле Dynamics CRM

Я написал следующую функцию для получения записей SharePointDocumentLocation относительно учетной записи или контакта. Однако, несмотря на то, что я предоставляю идентификатор, который определенно имеет запись SPDL, результат подсчета в EntityCollection, который возвращается, всегда равен 0. Почему мой запрос не возвращает записи SPDL?

internal static EntityCollection GetSPDocumentLocation(IOrganizationService service, Guid id)
{
    SharePointDocumentLocation spd = new SharePointDocumentLocation();
    QueryExpression query = new QueryExpression
    {
        EntityName = "sharepointdocumentlocation",
        ColumnSet = new ColumnSet("sharepointdocumentlocationid"),
        Criteria = new FilterExpression
        {
            Conditions = 
            { 
                new ConditionExpression
                {
                    AttributeName = "regardingobjectid",
                    Operator = ConditionOperator.Equal,
                    Values = { id }
                }
            }
        }
    };
    return service.RetrieveMultiple(query);
}

Следующий код работает

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel.Description;
using System.Net;
using Microsoft.Xrm.Sdk.Query;

namespace CRMConsoleTests
{
    class Program
    {
        static void Main(string[] args)
        {
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
            Uri orgUri = new Uri("http://localhost/CRMDEV2/XRMServices/2011/Organization.svc");
            Uri homeRealmUri = null;
            using (OrganizationServiceProxy service = new OrganizationServiceProxy(orgUri, homeRealmUri, credentials, null))
            {
                //ConditionExpression ce = new ConditionExpression("regardingobjectid", ConditionOperator.Equal, new Guid(""));
                QueryExpression qe = new QueryExpression("sharepointdocumentlocation");
                qe.ColumnSet = new ColumnSet(new String[] { "sharepointdocumentlocationid", "regardingobjectid" });
                //qe.Criteria.AddCondition(ce);

                EntityCollection result = service.RetrieveMultiple(qe);

                foreach (Entity entity in result.Entities)
                {
                    Console.WriteLine("Results for the first record: ");
                    SharePointDocumentLocation spd = entity.ToEntity<SharePointDocumentLocation>();
                    if (spd.RegardingObjectId != null)
                    {
                        Console.WriteLine("Id: " + spd.SharePointDocumentLocationId.ToString() + " with RoId: " + spd.RegardingObjectId.Id.ToString());
                    }
                }
                Console.ReadLine();
            }
        }
    }
}

Он извлекает 4 записи, и когда я отлаживаю приведенный выше код плагина, он извлекает 3 записи.


person Martijn Burger    schedule 14.01.2014    source источник


Ответы (1)


С вашим QueryExpression все выглядит хорошо, хотя я бы написал немного короче (примерно так):

var qe = new QueryExpression(SharePointDocumentLocation.EntityLogicalName){
    ColmnSet = new ColumnSet("sharepointdocumentlocationid"),
};
qe.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, id);

Потому что я не вижу ничего плохого в QueryExpression, что приводит меня к двум предположениям.

  1. Вы используете олицетворение на IOrganizationService, а у олицетворяемого пользователя нет прав на SharePointDocumentLocation. Вы не получите ошибку, вы просто не получите никаких записей.

  2. Идентификатор, который вы передаете, неверен.

Я бы удалил Criteria и посмотрел, сколько записей вы вернете. Если вы не вернете все записи, вы знаете, что проблема связана с догадкой № 1.

Если вы получите все записи, добавьте regardingobjectid к ColumnSet и получите первую запись без каких-либо Criteria в QueryExpression, затем вызовите этот метод, передав идентификатор regardingobject, который вы вернули. Если при добавлении ограничения regardingobjectid ничего не получено, значит, что-то еще не так.

Обновлять

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

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

person Daryl    schedule 15.01.2014
comment
Привет Дэрил. Я попытался удалить условие, оно дает мне общее количество записей SharePointDocumentLocation. Значит, у меня есть права. Я попробую и даббельпроверю, есть ли id прямо сейчас. - person Martijn Burger; 15.01.2014
comment
Привет Дэрил. Я отладил еще кое-что. Странная вещь. У меня есть 3 учетных записи, связанные с записью о местоположении документа. Допустим, учетные записи GUID: ACC1, ACC2 и ACC3. Если я укажу GUID ACC1, коллекция сущностей, которая будет возвращена без оператора условия, будет состоять из трех учетных записей с GUID ACC2, ACC3 и неизвестным GUID. Если я укажу GUID ACC2, возвращаемая коллекция сущностей будет иметь GUID ACC1, ACC3 и тот же неизвестный GUID. Я действительно потерялся!? - person Martijn Burger; 15.01.2014
comment
Некоторая дополнительная информация: Функция вызывается из события плагина Delete PreOperation. Может быть, система возвращает какой-то идентификатор ссылки на объект, когда он находится в транзакции? - person Martijn Burger; 15.01.2014
comment
@MartijnBurger Извлеките свою логику из плагина в приложение командной строки, просто чтобы доказать, что она связана с плагином. Кроме того, когда сущность выполняет предварительную операцию удаления? - person Daryl; 15.01.2014
comment
Хороший совет, Дэрил. Я собираюсь попробовать это. Удаление находится в удостоверении личности учетной записи. Я пытаюсь определить все записи sharepointdocumentlocation, связанные с удаленной учетной записью. - person Martijn Burger; 15.01.2014
comment
@MartijnBurger и что с ними делать? Назначить их другому аккаунту? - person Daryl; 15.01.2014
comment
Дэрил, определенно должен быть плагин. Я разместил код консоли выше, работает как шарм. Любые идеи? - person Martijn Burger; 15.01.2014
comment
@MartijnBurger, как устроены отношения? Каскадные удаления? - person Daryl; 15.01.2014
comment
Да, это каскадное удаление, это стандартная настройка. Также нельзя настроить. Я думал, что это была предварительная операция, поэтому spdoclocs не следовало удалять в этот момент. Верно? Я попытаюсь построить его для предварительной проверки, посмотрим, как это пойдет. - person Martijn Burger; 15.01.2014
comment
Регистрация PreValidat работает. Проблема решена, так что это зеленая галочка. Тем не менее, объяснение, почему было бы неплохо. :с - person Martijn Burger; 15.01.2014