CRM Dynamics SDK 如何访问相关数据

CRM Dynamics SDK how to access related data

我正在使用由 CrmSvcUtil 生成的早期绑定实体,并且我正在通过检索帐户实体来测试 SDK:-

var account = myContext.AccountSet.FirstOrDefault(o => o.Id == Guid.Parse("..."));

(顺便说一句,有没有更简单的方法来通过 ID 检索实体?!)

查看返回的帐户对象,我可以看到 OptionSetValue 类型的各种属性(例如 "PreferredContactMethodCode")。如何从此 OptionSetValue 对象获取实际项目?

类似地,有许多 EntityReference 类型的属性,其中包含一个 Id 和 LogicalName(我假定的实体名称)。我如何填充这样的 属性 - 它是 Get... 方法之一吗?这些是否必须单独调用,或者是否可以 "pre-fetch" 某些关系作为检索帐户实体的初始查询的一部分?

类似于各种 IEnumerable<> 属性(大概对应于 1-M 实体关系),例如IEnumerable 类型的 属性 称为 "opportunity_customer_accounts"。我如何填充这些属性之一?并且(再次)这是否必须作为单独的 query/method 调用来完成,还是可以 "pre-fetched"?

检索

我不太确定检索操作可以变得多么简单,但是对于单个记录,上下文的用户可能有点矫枉过正。因此,您可以直接使用 IOrganizationService 检索您知道的特定记录:

account = service.Retrieve("account", Guid.Parse("..."), new ColumnSet(true));

选项集标签

对于 OptionSet 标签,您可以在此处查看我的回答:How to get the option set from a field in an entity in CRM 2011 using crm sdk and C#

如果您需要实体上多个 OptionSet 的标签,您可能只想检索实体的元数据一次 (http://srinivasrajulapudi.blogspot.com/2012/01/retrieve-entity-metadata-in-crm-2011.html):

string entityName ="contact";

// Get the metadata for the currently list's entity
// This metadata is used to create a "Property Descriptor Collection"
RetrieveEntityRequest mdRequest = new RetrieveEntityRequest ( )
{ EntityFilters = EntityFilters.All,
LogicalName = entityName,
RetrieveAsIfPublished = false
};

// Execute the request
RetrieveEntityResponse entityResponse = ( RetrieveEntityResponse ) this.ServiceProxy.Execute ( mdRequest );

EntityMetadata entityData = entityResponse.EntityMetadata;



//To Get Option Set Data
var preferdList= ( entityData.Attributes.Where ( p => p.LogicalName == "preferredcontactmethodcode" ) ).ToList ( ).FirstOrDefault ( ); ;

if ( preferdList != null ) {

PicklistAttributeMetadata optionList= preferdList as PicklistAttributeMetadata;
OptionSetMetadata opValues= optionList.OptionSet;
foreach ( var op in opValues.Options ) {

preferedMethod.Add ( new OptionSet { Value = op.Value.Value, Text = op.Label.LocalizedLabels[0].Label.ToString() } );
}

}

EntityReference() 要设置 EntityReference 类型字段:

account.primarycontact = new EntityReference("contact", Guide.Parse("..."));

如果它们有值并且您请求了 ColumnSet() 中的列,则它们应该被填充,所以我不确定我是否理解您的问题。如果你的意思是,你想要完整的记录,那么你需要为记录做一个service.Retrieve(...)

相关实体(即,opportunity_customer_accounts)

这是使用 OrganizationServiceContext 让生活更轻松的地方 (https://msdn.microsoft.com/en-us/library/gg695791.aspx):

context.LoadProperty(联系人,"transactioncurrency_contact");

//动态读取相关实体 var currency = contact.GetRelatedEntity("transactioncurrency_contact"); Console.WriteLine(currency.GetAttributeValue("currencyname"));

//静态读取相关实体 var currencyStatic = contact.transactioncurrency_contact; Console.WriteLine(currencyStatic.CurrencyName);

如果您没有使用 OrganizationServiceContext,您可以尝试使用 LinkedEntities 的 QueryExpression,尽管我从来没有这样做来填充早期绑定的实体,所以我不知道是否它有效(也许有人会添加带有答案的评论。)