2016-10-10 3 views
2

Я сделал код, чтобы проверить, существует ли запись в CRM. Проблема в том, что IOrganisationService.Retrieve возвращает ошибку вместо нуля, когда запись не найдена. Я ожидаю, что несколько записей не будут найдены, и я не хочу использовать попытку catch, а затем использовать ошибку из catch.IOrganisationService.Retrieve Запись не существует

using (OrganizationServiceProxy serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, credentials, null)) 
      { 
       IOrganizationService service = (IOrganizationService)serviceProxy; 
       //Get record 

       var record = service.Retrieve(entryId, guid, new ColumnSet(true)); //switch to var if no work 
       //Check if record is not null/empty 
       recordExists = !String.IsNullOrWhiteSpace(record.Id.ToString()); //<- does the record exist 
      } 

Предложения?

+0

Почему вы не хотите использовать try/catch? См. Мой ответ на помощь. – Phil

ответ

1

Использования RetrieveMultiple для получения пользователей с ID вы заинтересованы в:

// Create and cache the plugin context 
this.context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
this.service = serviceFactory.CreateOrganizationService(this.context.UserId); 

// Retrieve users with certain ID 
Guid userId = Guid.NewGuid(); 
var query = new QueryExpression("systemuser"); 
query.Criteria.AddCondition(new ConditionExpression("systemuserid", ConditionOperator.Equal, userId)); 

EntityCollection users; 
try 
{ 
    users = this.service.RetrieveMultiple(query); 
} 
catch (FaultException<OrganizationServiceFault> faultException) 
{ 
    throw new InvalidPluginExecutionException($"Failed to retrieve system users that have an ID of '{userId}'", faultException); 
} 

if (users.Entities.Length == 0) // (or !users.Entities.Any() using Linq) 
{ 
    // Do something 
} 
+0

Код работает, может быть, мои объяснения были немного плохими. Ошибка метода Retrieve, если результат не найден; Я хочу знать, какие CRM-записи не существуют, не имея необходимости использовать catch, чтобы сказать, что запись не существует. – Zain

+0

Я не думаю, что это возможно с помощью метода «Извлечь». Служба CRM выдаст исключение типа 'FaultException ', если запись не существует. Однако вы могли бы использовать 'RetrieveMultiple' для получения списка записей, у которых есть ID, который вам интересен - если длина равна 0, исключение не будет выбрано. Я обновил свой ответ. – Phil

+0

Предполагается, что метод «Восстановить» возвращает указанную запись, и вызов в нее будет работать только в редких случаях. Следовательно, обработка ошибок должна выполняться на максимально возможном уровне. –

2

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

  1. Запись была удалена другим пользователем или процессом.
  2. Пользователь не имеет достаточных привилегий чтения.

Если вам нужно запросить данные, которые могут отсутствовать или когда запрос может дать нуль, одну или несколько записей, используйте QueryExpression запросов; вы можете выдать эти запросы с помощью метода RetrieveMultiple. Если вам нравится, вы также можете использовать LINQ для CRM, который в основном обертывает функциональность QueryExpression.

Смежные вопросы