Преобразование EntityReference в Entity

Кто-нибудь знает, как можно преобразовать EntityReference в Entity.

protected override void Execute(CodeActivityContext executionContext)
{
    [Input("Email")]
    [ReferenceTarget("email")]
    public InArgument<Entity> EMail { get; set; }


    Entity MyEmail = EMail.Get<Entity>(executionContext);

Это даст мне ошибку. Невозможно преобразовать это.

Ответ 1

Самый короткий ответ на ваши вопросы - запросить базу данных для объекта, который указал (ссылается) на ссылку на сущность. Я всегда рассматривал ссылки на сущности как (грубые), эквивалентные указателям на С++. Он получил к нему адрес (guid), но вам нужно снять ссылку, чтобы добраться до меда. Вы делаете это так.

IOrganizationService organization = ...;
EntityReference reference = ...;

Entity entity = organization.Retrieve(reference.LogicalName, reference.Id, 
  new ColumnSet("field_1", "field_2", ..., "field_z"));

Когда я делаю много преобразований из EntityReference в Entity, я развертываю метод расширения с необязательным параметром для полей.

public static Entity ActualEntity(this EntityReference reference,
  IOrganizationService organization, String[] fields = null)
{
  if (fields == null)
    return organization.Retrieve(reference.LogicalName, reference.Id, 
      new ColumnSet(true));
  return organization.Retrieve(reference.LogicalName, reference.Id, 
    new ColumnSet(fields));
}

Вы можете прочитать больше и сравнить EntityReference и Entity.

Ответ 2

EntityReference - это просто логическое имя, имя и идентификатор объекта. Таким образом, чтобы получить Entity, вам просто нужно создать сущность, используя свойства EntityReference.

Вот метод расширения, который выполняет это для вас:

public static Entity GetEntity(this EntityReference e)
{
    return new Entity(e.LogicalName) { Id = e.Id };
}

Не забывайте, что ни один из других атрибутов объекта не будет заполнен. Если вам нужны атрибуты, вам нужно запросить их:

public static Entity GetEntity(this IOrganizationService service, EntityReference e)
{
    return service.Retrieve(e.LogicalName, e.Id, new ColumnSet(true));
}

И если вам нравится ответ @Konrad Field, сделайте его массивом параметров, и это будет приятнее

public static Entity GetEntity(this IOrganizationService service, EntityReference e, 
   params String[] fields)
{
    return service.Retrieve(e.LogicalName, e.Id, new ColumnSet(fields));
}

Ответ 3

Entity и EntityReference различны. EntityReference является ссылкой для записи, содержащей GUID и логическое имя объекта. Вы должны получить доступ к объекту через руководство и логическое имя. Что-то вроде этого:

service.Retrieve(logicalname, guid, new ColumnSet(columns));