2009-06-30 10 views
4

Ich versuche, Informationen aus einer CRM-Installation zu ziehen, und dies ist bis jetzt für die Verwendung der Standardfelder in Ordnung. Ich habe jedoch Schwierigkeiten, benutzerdefinierte Felder abzurufen, z. B. Kontakte haben ein benutzerdefiniertes Feld namens web_username.Abrufen dynamischer CRM-Felder mit Webservice-Abfrage

derzeit Mein Code ist

 QueryExpression query = new QueryExpression(); 
     query.EntityName = "contact"; 
     ColumnSet cols = new ColumnSet(); 
     cols.Attributes = new string[] { "firstname", "lastname" }; 
     query.ColumnSet = cols; 

     BusinessEntityCollection beReturned = tomService.RetrieveMultiple(query); 
     foreach (contact _contact in beReturned.BusinessEntities) 
     { 
      DataRow dr = dt.NewRow(); 
      dr["firstname"] = _contact.firstname; 
      dr["lastname"] = _contact.lastname; 
      dt.Rows.Add(dr); 
     } 

Wie füge ich benutzerdefinierte Felder in meiner Anfrage? Ich habe versucht, herum zu suchen, aber noch kein Glück, aber ich könnte falsch suchen, wie ich CRM-Ausdrücke nicht gewohnt bin.

Prost im Voraus!

+0

Sie auf diesen Link für Ihre Lösung beziehen. [https://stackoverflow.com/questions/43984397/retrieve-fetch-records-from-dynamic-365-crm-using-c-sharp-code/43985297#43985297][1] – Piyush

Antwort

6

Ich konnte seit dem das lösen. Falls es für irgendjemanden von Nutzen ist, habe ich das getan. Die Abfrage ist wie zuvor eingerichtet, außer dass ich mein benutzerdefiniertes Feld zu ColumnSet hinzugefügt habe.

cols.Attributes = new string[] { "firstname", "lastname", "new_web_username" }; 

und verwendet dann RetrieveMultipleResponse und Antrag mit ReturnDynamicEntities auf true gesetzt

 RetrieveMultipleResponse retrived = new RetrieveMultipleResponse(); 

     RetrieveMultipleRequest retrive = new RetrieveMultipleRequest(); 
     retrive.Query = query; 
     retrive.ReturnDynamicEntities = true; 

     retrived = (RetrieveMultipleResponse)tomService.Execute(retrive); 

Bitte noch kommentieren, wenn es einen besseren Weg für mich, dies zu tun.

EDIT das Beispiel in meiner ursprünglichen Frage verwenden, wenn Sie zu einem Kontakt werfen

contact myContact = (contact)myService.Retrieve(EntityName.contact.ToString(), userID, cols); 

Sie können dann Zugriff auf die Eigenschaften des Objekts

   phone = myContact.telephone1; 
      password = myContact.new_password; 

Wenn Sie Ihr CRM WebReference benutzerdefinierte aktualisieren Felder, die Sie in CRM hinzugefügt haben, sind verfügbar.

0
public List<Entity> GetEntitiesCollection(IOrganizationService service, string entityName, ColumnSet col) 
    { 
         try 
         { 
          QueryExpression query = new QueryExpression 
          { 
           EntityName = entityName, 
           ColumnSet = col 
          }; 
          var testResult = service.RetrieveMultiple(query); 
          var testResultSorted = testResult.Entities.OrderBy(x => x.LogicalName).ToList(); 

      foreach (Entity res in testResultSorted) 
         { 
          var keySorted = res.Attributes.OrderBy(x => x.Key).ToList(); 
          DataRow dr = null; 
          dr = dt.NewRow(); 
          foreach (var attribute in keySorted) 
          { 
           try 
           { 
            if (attribute.Value.ToString() == "Microsoft.Xrm.Sdk.OptionSetValue") 
            { 
             var valueofattribute = GetoptionsetText(entityName, attribute.Key, ((Microsoft.Xrm.Sdk.OptionSetValue)attribute.Value).Value, _service); 
dr[attribute.Key] = valueofattribute; 


             } 
             else if (attribute.Value.ToString() == "Microsoft.Xrm.Sdk.EntityReference") 
             { 
              dr[attribute.Key] = ((Microsoft.Xrm.Sdk.EntityReference)attribute.Value).Name; 
             } 
             else 
             { 
              dr[attribute.Key] = attribute.Value; 
             } 
            } 
            catch (Exception ex) 
            { 
             Response.Write("<br/>optionset Error is :" + ex.Message); 
            } 
           } 
           dt.Rows.Add(dr); 
          } 
       return testResultSorted; 
       } 
         catch (Exception ex) 
         { 
          Response.Write("<br/> Error Message : " + ex.Message); 
          return null; 
         } 
      } 

// hier i eine andere Funktion erwähnt haben:

var valueofattribute = GetoptionsetText(entityName, attribute.Key, ((Microsoft.Xrm.Sdk.OptionSetValue)attribute.Value).Value, _service); 

// Definition dieser Funktion ist wie folgt:

public static string GetoptionsetText(string entityName, string attributeName, int optionSetValue, IOrganizationService service) 
    { 
       string AttributeName = attributeName; 
     string EntityLogicalName = entityName; 
     RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest 
     { 
      EntityFilters = EntityFilters.All, 
      LogicalName = entityName 
     }; 
     RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)service.Execute(retrieveDetails); 
     Microsoft.Xrm.Sdk.Metadata.EntityMetadata metadata = retrieveEntityResponseObj.EntityMetadata; 
     Microsoft.Xrm.Sdk.Metadata.PicklistAttributeMetadata picklistMetadata = metadata.Attributes.FirstOrDefault(attribute => String.Equals(attribute.LogicalName, attributeName, StringComparison.OrdinalIgnoreCase)) as Microsoft.Xrm.Sdk.Metadata.PicklistAttributeMetadata; 
     Microsoft.Xrm.Sdk.Metadata.OptionSetMetadata options = picklistMetadata.OptionSet; 

     IList<OptionMetadata> OptionsList = (from o in options.Options 
              where o.Value.Value == optionSetValue 
              select o).ToList(); 
     string optionsetLabel = (OptionsList.First()).Label.UserLocalizedLabel.Label; 
     return optionsetLabel; 
    }