2012-12-04 3 views
10

का उपयोग करके प्रत्येक की संबंधित इकाइयों को पुनर्प्राप्त करें, मैं सीआरएम से इकाइयों की एक सूची पुनर्प्राप्त करने का प्रयास कर रहा हूं, लेकिन मैं संबंधित संस्थाओं के साथ प्रत्येक को प्राप्त करना चाहता हूं। अब तक, मैं निम्नलिखित कोड है: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

संबंधित संस्थाओं डेटा को पुनः प्राप्त करने के लिए एक दृष्टिकोण - आपकी क्वेरी में लिंकइन्टिटी जोड़ना। नीचे दिए गए उदाहरण आप एक विचार कर देगा कि यह कैसे बनाने के लिए:

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

धन्यवाद सर्गेईएस। यह सबसे अच्छा नहीं है जो मुझे उम्मीद है, लेकिन सीआरएम क्या पेशकश करता है :)। अगर मेरे पास 5 संबंधित इकाइयों के साथ 100 खातों की एक सूची है, तो प्रत्येक के 3 रिकॉर्ड के साथ, मुझे सर्वर से 24.300 रिकॉर्ड मिलेंगे: एस – Milton

5

RetrieveMultipleRequest एक के कई उदाहरण लौटने के लिए है विशेष प्रकार की इकाई। मैंने सी # से सीआरएम एसडीके का उपयोग करके एक वर्ष बिताया है और मुझे एक ही प्रश्न में उन संबंधित इकाई संग्रहों को पॉप्युलेट करने का कोई तरीका नहीं मिला है। यह मूल रूप से आपको दो विकल्पों के साथ छोड़ देता है:

  1. सेलिसीएस की सिफारिश के अनुसार AliasedValue का उपयोग करें। याद रखें जब पूछताछ 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

धन्यवाद डेरिल। मुझे लगता है कि कुछ बार, दूसरा सबसे अच्छा तरीका है। वैसे भी, मुझे आशा है कि सीआरएम लोग इसे भविष्य में संबंधित संस्थाओं के रूप में दें :) – Milton