2009-06-23 8 views
0

Wir verwenden MSCRM Dynamics, und wir versuchen, alle Kinder eines bestimmten Benutzers zu erhalten. (Ein Benutzer hat einen Manager, der Manager hat "Kinder".) Folgendes funktioniert, aber löst eine Ausnahme aus, wenn der Benutzer keine Kinder hat. Das erscheint zunächst vielleicht logisch, aber warum sollte man nicht einfach einen leeren Satz zurückgeben? Und von allen Dingen, es wirft eine SoapException mit einer kryptischen Nachricht von "Ungültiges Argument" (was falsch ist) und die .Detail.InnerText sagt "0x80040203 Der Wert für ConditionOperator übergeben. In ist leere Plattform". Wenn Sie sich die entsprechende Response-Klasse ansehen, hat sie eine Sammlung - warum nicht einfach leer lassen?CRM: Get Kinder wirft Ausnahme auf keine Kinder

// 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)); 
} 

Antwort

2

Ich stimme zu, es sollte wahrscheinlich nur ein leeres Ergebnis zurückgeben. Meine Vermutung wäre unter der Haube, ein Schritt der Ausführung der Anfrage oder die Vorbereitung der Antwort wird in eine QueryExpression übersetzt. QueryExpressions explodiert, wenn Sie eine ConditionExpression verwenden, die ConditionOperator.In verwendet, und Sie übergeben eine leere Liste. Es kann also so etwas wie eine Liste von Kind-Systembenutzer-GUIDs sein, die in einigen Fällen eine leere Liste ist, dann versucht, alle Attribute der Systembenutzer in dieser Liste mit einem anderen QueryExpression abzurufen und das ist es, was die Ausnahme auslöst.

Sie können wahrscheinlich eine eigene QueryExpression oder FetchXML entwerfen, die Sie die gleichen Ergebnisse ohne die Nebenwirkung von es wirft eine Ausnahme, wenn die Liste leer ist, oder fangen Sie einfach die Ausnahme und überprüfen Sie für diesen bestimmten Fehlercode und Schluck es.

+0

Wir schlucken derzeit alle SoapExceptions, was ich wirklich als eine schlechte Lösung empfinde. Ich muss in dem Ausdruck herumkramen, um zu sehen, ob ich diesen Fall besser isolieren kann, wenn keine bessere Auflösung gefunden werden kann. – Thanatos