将EntityReference转换为实体

hel*_*o B 10 dynamic-programming dynamics-crm dynamics-crm-2011

有谁知道如何将EntityReference转换为实体.

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


    Entity MyEmail = EMail.Get<Entity>(executionContext);
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误.无法转换此.

Kon*_*ten 16

对问题的最简单回答是在数据库中查询实体引用指出(引用)的实体.我一直认为实体引用(粗略)等同于C++中的指针.它有地址(guid),但你需要取消引用它以获得蜂蜜.你是这样做的.

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

Entity entity = organization.Retrieve(reference.LogicalName, reference.Id, 
  new ColumnSet("field_1", "field_2", ..., "field_z"));
Run Code Online (Sandbox Code Playgroud)

当我从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));
}
Run Code Online (Sandbox Code Playgroud)

您可以阅读更多内容并比较EntityReferenceEntity.


Dar*_*ryl 14

An EntityReference只是实体的logicalName,name和id.所以要获得一个Entity,你只需要使用的属性创建实体EntityReference.

这是一个为您执行的扩展方法:

public static Entity GetEntity(this EntityReference e)
{
    return new Entity(e.LogicalName) { Id = e.Id };
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将不会填充实体的任何其他属性.如果您需要您需要查询的属性:

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

如果你喜欢@ Konrad的Field回答,那就把它变成一个params数组,它可以更好地调用

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