2013-03-07 70 views
10

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

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


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

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

回答

13

您的问题的最短答案是查询数据库中的实体引用指出的(引用)的实体。我一直将实体引用看作(粗略的)等同于C++中的指针。它有它的地址(guid),但你需要去引用它以获得亲爱的。你这样做。

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

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

当我做了很多的EntityReference转换为实体的,我部署以田野可选参数的扩展方法。

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

你可以阅读更多的和比较EntityReferenceEntity

13

EntityReference只是实体的logicalName,name和id。因此,要获得Entity,您只需使用EntityReference的属性创建实体。

这里是执行一个扩展方法,对你:

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

不要忘了,没有实体的其他属性将被填充。如果你想要的属性,您需要查询他们:

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

,如果你喜欢@康拉德的现场回答,使它成为一个参数数组,它是更好的调用

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

实体和EntityReference是不同的。 EntityReference是包含GUID和实体的逻辑名称的记录的参考。您必须通过guid和逻辑名称获取实体访问权限。类似的东西:

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