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,尽管我从来没有这样做来填充早期绑定的实体,所以我不知道是否它有效(也许有人会添加带有答案的评论。)
我正在使用由 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,尽管我从来没有这样做来填充早期绑定的实体,所以我不知道是否它有效(也许有人会添加带有答案的评论。)