2012-12-04 27 views
10

Tôi đang cố gắng truy xuất danh sách các thực thể từ CRM, nhưng tôi muốn có được một thực thể với các thực thể liên quan. Cho đến nay, tôi đã có mã sau:Truy xuất các thực thể liên quan của mỗi mục, sử dụng 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); 

Trong phản hồi biến, tôi có thể thấy thuộc tính EntityCollection, nhưng bên trong, Thực thể liên quan luôn bị trống.

Related entities count is 0

Tôi muốn biết nếu nó có thể lấy các thiết lập của một tổ chức nào đó, với các đối tượng liên quan, sử dụng RetrieveMultipleRequest, chứ không phải đi từng người một bằng RetrieveRequest.

Trả lời

8

Một cách tiếp cận để truy xuất dữ liệu thực thể có liên quan - thêm LinkEntities vào truy vấn của bạn. Ví dụ dưới đây sẽ làm cho bạn một ý tưởng làm thế nào để làm cho điều này:

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

Và sau đó bạn có thể truy cập các thuộc tính từ các đơn vị có liên quan sử dụng EntityAlias ​​bạn đã nêu ở trên:

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

Cảm ơn SergeyS. Đó không phải là tốt nhất mà tôi hy vọng, nhưng là những gì CRM cung cấp :). Nếu tôi có một danh sách 100 tài khoản với 5 thực thể liên quan, với 3 hồ sơ mỗi một, tôi sẽ nhận được 24.300 hồ sơ từ máy chủ: S – Milton

5

Các RetrieveMultipleRequest là trả lại nhiều trường hợp của một loại thực thể cụ thể. Tôi đã dành một năm sử dụng SDK CRM từ C# và tôi đã không tìm thấy cách nào để điền các bộ sưu tập thực thể liên quan đó vào một truy vấn đơn lẻ. Điều này về cơ bản khiến bạn có hai tùy chọn:

  1. Sử dụng AliasedValue như SergeyS đề xuất. Hãy nhớ khi truy vấn 1: Nhiều mối quan hệ, lưu ý rằng bạn có thể trả lại nhiều kết quả cho cùng một thực thể cha. Đây là những gì tôi sử dụng hầu hết thời gian.

  2. Thực hiện truy vấn thứ hai cho từng mối quan hệ bạn muốn truy cập. Có thể bạn sẽ nhận được hiệu suất tốt hơn nếu bạn có thể sử dụng câu lệnh IN trong truy vấn thứ hai của mình, dựa trên kết quả của truy vấn đầu tiên, thay vì thực hiện truy vấn riêng cho từng kết quả đầu tiên.

Dưới đây là một số mã giả để hiển thị sự khác biệt.

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

Cảm ơn Daryl. Tôi nghĩ rằng một số lần, thứ hai là cách tiếp cận tốt nhất. Dù sao, tôi hy vọng các chàng trai CRM cho nó như là các thực thể liên quan trong tương lai :) – Milton