2013-03-07 99 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));