13

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

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


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

这给了我一个错误。不能转换这个。

4

3 回答 3

22

对您的问题的最短回答是在数据库中查询实体引用指出(引用)的实体。我一直将实体引用视为(粗略)等同于 C++ 中的指针。它有它的地址(guid),但你需要取消引用它才能找到蜂蜜。你这样做是这样的。

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

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

当我进行大量从EntityReferenceEntity的转换时,我部署了带有可选参数的扩展方法。

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

You can read more and compare EntityReference and Entity.

于 2013-03-07T18:45:42.270 回答
14

AnEntityReference只是实体的逻辑名称、名称和 ID。因此,要获得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 的现场回答,请将其设为 params 数组,这样调用会更好

public static Entity GetEntity(this IOrganizationService service, EntityReference e, 
   params String[] fields)
{
    return service.Retrieve(e.LogicalName, e.Id, new ColumnSet(fields));
}
于 2013-03-07T17:50:21.487 回答
4

Entity 和 EntityReference 是不同的。EntityReference是对包含 GUID 和实体逻辑名称的记录的引用。您必须通过 guid 和逻辑名称来访问实体。像这样的东西:

service.Retrieve(logicalname, guid, new ColumnSet(columns));
于 2013-03-07T17:51:40.927 回答