В FetchXML отсутствует идентификатор строго типизированной связанной сущности

Видел этот пост о преобразовании результатов из FetchXML в строго типизированные сущности CRM.

//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, но не из ссылочных сущностей.


person ja67    schedule 08.07.2016    source источник
comment
Вы искали new_customid? Можете ли вы опубликовать свой fetchxml?   -  person dynamicallyCRM    schedule 08.07.2016
comment
Что это за пост? Также опубликуйте свой запрос и опишите свою модель объекта, трудно ответить на этот вопрос на основе предоставленной вами информации.   -  person James Wood    schedule 10.07.2016


Ответы (1)


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

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

person Ian    schedule 12.07.2016
comment
Верный. Но мне нужен идентификатор сущности, а не только cc_patientid. Но я думаю, что, возможно, нашел его. Если я ищу тип ссылки на сущность данного атрибута, я могу найти идентификатор. Пока это работает. - person ja67; 14.07.2016