2016-07-08 4 views
0

Пила это сообщение о преобразовании результатов из FetchXML в строго типизированные объекты CRM.FetchXML строго типизированный связанный объект отсутствует ID

//CrmEntity is a base class I insert into my generated code 
//to differentiate early-bound classes; you can use Entity 

public static T ToRelatedEntity<T>(this Entity rawEntity, string relatedAlias) 
    where T:CrmEntity, new()   
{ 
    var result = new Entity(new T().LogicalName); 

    foreach(var attribute in rawEntity.Attributes 
           .Where(kvp=>kvp.Key 
              .StartsWith(relatedAlias + "."))) 
    { 
     var newName = attribute.Key.Replace(relatedAlias + ".", String.Empty); 
     result[newName] = ((AliasedValue)attribute.Value).Value; 
    } 
    foreach(var formattedValue in rawEntity.FormattedValues 
            .Where(kvp=>kvp.Key 
               .StartsWith(relatedAlias + "."))) 
    { 
     var newName = formattedValue.Key.Replace(relatedAlias + ".", String.Empty); 
     result.FormattedValues[newName] = formattedValue.Value; 
    } 

    return result.ToEntity<T>(); 
} 

//usage 
var query = new FetchExpression(fetchXml); 
var response = service.RetrieveMultiple(query); 
var contact = response.Entities[0].ToEntity<Contact>(); 
var newCustom = response.Entities[0].ToRelatedEntity<new_custom>("nc"); 

К сожалению, мне нужно получить идентификатор связанных объектов, и после вызова FetchXML не возвращаются никакие идентификаторы; просто пустые гиды.

Я могу получить идентификатор родительской сущности (cc_case), вызвав result.ID.

Но как насчет детей? Как получить идентификаторы?

EDIT: Вот пример FetchXML:

<fetch no-lock="true"> 
<entity name="cc_case" > 
<all-attributes/> 
<filter type="and" > 
    <condition attribute="cc_caseid" operator="equals" > 
    XXXX 
    </condition> 
</filter> 
<link-entity name="cc_contact_account" from="contactid" to="cc_submitterid" link-type="outer" alias="CC_Contact_Account" > 
    <all-attributes/> 
    <link-entity name="account" from="accountid" to="accountid" alias="Account" > 
    <all-attributes/> 
    <link-entity name="contact" from="contactid" to="cc_billingcontactid" alias="Contact" > 
     <all-attributes/> 
    </link-entity> 
    </link-entity> 
</link-entity> 
<link-entity name="cc_patient" from="cc_patientid" to="cc_patientid" link-type="outer" alias="Patient" > 
    <all-attributes/> 
</link-entity> 

Итак, вопрос в том, как вы получите идентификатор из cc_contact_account и cc_patient лиц. Я могу получить идентификатор из объекта cc_case, но не из связных объектов.

+1

Вы искали "new_customid"? Можете ли вы разместить свой fetchxml? – dynamicallyCRM

+0

Что такое «этот пост»? Также опубликуйте свой запрос и опишите свою модель сущности, трудно ответить на этот вопрос на основе предоставленной вами информации. –

ответ

0

Идентификатор от объектов-ссылок должен быть доступен как атрибуты с псевдонимом в AttributeCollection, поэтому в вашем случае result["Patient.cc_patientid"] предоставит вам идентификатор пациента. Это то, что делает ваша функция ToRelatedEntity.

Если cc_contact_account является отношением «многие ко многим», я не думаю, что он имел бы идентификатор вообще, но вы могли бы использовать тот же метод псевдонимов, что и выше, чтобы получить идентификатор на другой стороне отношения.

+0

Исправить. Но я хочу «Id» от Entity, а не только cc_patientid. Но я думаю, что, возможно, нашел это. Если я ищу тип Entity Reference для данного атрибута, я могу найти идентификатор. Пока это работает. – ja67