2012-12-04 41 views
10

我正在嘗試從CRM實體的名單,但我想獲得每一個與相關實體。到目前爲止,我已經下面的代碼:每個檢索相關實體,使用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); 

在不同反應,我可以看到EntityCollection屬性,但內,相關的實體總是空的。

Related entities count is 0

我想知道是否有可能檢索設定一個給定的實體,與相關的實體,使用RetrieveMultipleRequest,使用RetrieveRequest而不是去一個接一個。

回答

8

一種方法中檢索相關實體的數據 - 添加LinkEntities到您的查詢。下面的例子將讓你的想法如何使這個:

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

然後您可以在上面指定訪問使用EntityAlias相關實體的屬性:

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

感謝SergeyS。這不是我希望的最好的,但是CRM提供的是:)。如果我有100個賬戶5個相關的實體列表,以及3條記錄每一個,我會從服務器獲取24.300記錄:S – Milton

5

RetrieveMultipleRequest是返回的多個實例特定類型的實體。我已經使用CRM SDK從C#花了一年時間,我沒有發現在一個查詢中填充這些相關實體的集合的方式。這基本上讓你有兩個選擇:

  1. 使用AliasedValue爲SergeyS建議。請記住,在查詢1:多個關係時,請注意您可能會爲同一個父實體返回多個結果。這是我大部分時間使用的。

  2. 執行您要訪問的每個關係的第二查詢。如果您可以在第二個查詢中使用IN語句(基於第一個查詢的結果),而不是爲第一個查詢的每個結果執行單獨查詢,那麼您可能會獲得更好的性能。

下面是一些僞代碼來顯示差異。

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

感謝達里爾。我認爲有些時候,第二種是最好的方法。無論如何,我希望CRM的人將它作爲未來的相關實體:) – Milton