2012-12-04 8 views
10

Sto provando a recuperare un elenco di entità da CRM, ma mi piacerebbe ottenere ciascuna con le entità correlate. Finora, ho il seguente codice:Recupera le entità correlate di ciascuno, utilizzando RetrieveMultipleRequest

FilterExpression filterExpression = new FilterExpression(); 
ConditionExpression condition = new ConditionExpression(Constants.ModifiedOnAttribute, ConditionOperator.GreaterEqual, lastSync); 
filterExpression.AddCondition(condition); 

QueryExpression query = new QueryExpression() 
{ 
    EntityName = entityName, 
    ColumnSet = new ColumnSet(attributesMetadata.Select(att => att.Name).ToArray<string>()), 
    Criteria = filterExpression, 
    Distinct = false, 
    NoLock = true 
}; 

RetrieveMultipleRequest multipleRequest = new RetrieveMultipleRequest(); 
multipleRequest.Query = queryExpression; 

RetrieveMultipleResponse response = (RetrieveMultipleResponse)proxy.Execute(multipleRequest); 

Nella risposta variabile, posso vedere l'attributo EntityCollection, ma dentro, le entità correlate venire sempre vuoto.

Related entities count is 0

Mi piacerebbe sapere se è possibile recuperare il set di una data entità, con le entità correlate, utilizzando RetrieveMultipleRequest, piuttosto che andare ad uno ad uno utilizzando RetrieveRequest.

risposta

8

Un approccio per recuperare i dati relativi alle entità - aggiungendo LinkEntities alla query. Esempio di seguito vi farà un idea di come fare questo:

LinkEntity linkEntity = new LinkEntity("email", "new_emails", "activityid", "new_relatedemail", JoinOperator.Inner); 
linkEntity.Columns.AddColumn("versionnumber"); 
linkEntity.Columns.AddColumn("new_emailsid"); 
linkEntity.EntityAlias = "related"; 

query = new QueryExpression("email"); 
query.ColumnSet.AddColumn("activityid"); 
query.ColumnSet.AddColumn("versionnumber"); 
query.Criteria.AddCondition("modifiedon", ConditionOperator.NotNull); 
query.LinkEntities.Add(linkEntity); 

e quindi è possibile accedere agli attributi di entità correlate utilizzando EntityAlias ​​specificato sopra:

foreach (Entity entity in entities.Entities) 
{ 
    if ((long)(entity["related.versionnumber"] as AliasedValue).Value > 0) 
    { 
     stop = false; 
    } 
} 
+1

Grazie SergeyS. Non è il massimo che spero, ma è ciò che offre il CRM :). Se ho un elenco di 100 account con 5 entità correlate, con 3 record ciascuno, ottengo 24.300 record dal server: S – Milton

5

Il RetrieveMultipleRequest è per la restituzione più istanze di un particolare tipo di entità. Ho trascorso un anno a utilizzare CRM SDK da C# e non ho trovato alcun modo per popolare le raccolte di entità correlate in una singola query. Questo in pratica ti lascia due opzioni:

  1. Utilizzare AliasedValue come consigliato da SergeyS. Ricorda quando esegui una query su 1: Molte relazioni, tieni presente che potresti restituire più risultati per la stessa entità padre. Questo è quello che uso la maggior parte del tempo.

  2. Eseguire una seconda query per ciascuna relazione a cui si desidera accedere. Probabilmente otterrai prestazioni migliori se puoi utilizzare un'istruzione IN nella seconda query, in base ai risultati del primo, anziché eseguire una query separata per ogni risultato del primo.

Di seguito è riportato uno pseudo codice per mostrare la differenza.

var contacts = GetContacts(); 

// One Request to get the cars for the contacts 
var cars = GetCarsWhereContactIdIn(contacts.Select(c => c.new_ContactId)); 

foreach(var c in contacts){ 
    c.new_Cars.AddRange(cars.where(car => car.new_contactId = c.ContactId)); 
} 

// Verses 
var contacts = GetContacts(); 

foreach(var c in contacts){ 
    // One Request for each contact 
    c.new_Cars.AddRange(GetCarsForContact(c.ContactId)); 
} 
+0

Grazie Daryl. Penso che alcune volte, il secondo sia l'approccio migliore. Comunque, spero che i CRM lo diano come entità correlate in futuro :) – Milton