2009-06-23 5 views
0

Мы используем MSCRM Dynamics, и мы пытаемся получить всех детей определенного пользователя. (У пользователя есть менеджер, у менеджера есть «дети».) Следующее работает, но выдает исключение, если у пользователя нет детей. Возможно, сначала это кажется логичным, но почему бы просто не вернуть пустой набор? И из всего этого он выдает SoapException с загадочным сообщением «Invalid Argument» (что неверно), а .Detail.InnerText говорит «0x80040203 Значение, переданное для ConditionOperator.In - пустая платформа». Если вы посмотрите на соответствующий класс Response, у него есть коллекция - почему бы просто не оставить его пустым?CRM: Получить детей исключение для детей без детей

// Create the request object. 
RetrieveAllChildUsersSystemUserRequest retrieve = 
    new RetrieveAllChildUsersSystemUserRequest(); 

// Create the column set object that indicates the fields to be retrieved. 
ColumnSet cols = new ColumnSet(); 
cols.EntityName = "systemuserid"; 

// Set the column set. 
retrieve.ColumnSet = cols; 

// Set the ID of the parent user. 
retrieve.EntityId = context.UserId; 

RetrieveAllChildUsersSystemUserResponse retrieved = 
    new RetrieveAllChildUsersSystemUserResponse(); 

/// Execute the request. 
/// Catches if user does not have children 
/// (Check to see if user is manager) 

try 
{ 
    retrieved = 
     (RetrieveAllChildUsersSystemUserResponse)crmService.Execute(retrieve); 
} 
catch (System.Web.Services.Protocols.SoapException e) 
{ 
    throw new Exception(string.Format("{0}", e.Detail.InnerText)); 
} 

ответ

2

Согласен, это, вероятно, должно просто вернуть пустой результат. Мое предположение было бы под капотом, какой-то шаг выполнения запроса или подготовки ответа переводится в QueryExpression. Выражения QueryExpressions, если вы используете ConditionExpression, который использует ConditionOperator.In, и вы передаете ему пустой список. Таким образом, может быть что-то вроде того, что он получает список дочерних системных пользователей, которые в некоторых случаях являются пустым списком, а затем пытается извлечь все атрибуты пользователей системы из этого списка, используя другой QueryExpression, и это то, что выдает исключение.

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

+0

В настоящее время мы глотаем все SoapExceptions, которые, как я считаю, являются плохим решением. Мне нужно будет копаться в выражении, чтобы увидеть, могу ли я лучше изолировать этот случай, если не будет найдено лучшего разрешения. – Thanatos