我正在使用由CrmSvcUtil生成的早期绑定实体,我正在通过检索帐户实体来测试SDK: -
var account = myContext.AccountSet.FirstOrDefault(o => o.Id == Guid.Parse("..."));
(BTW是否有更简单的方法通过ID检索实体?!)
查看返回的帐户对象,我可以看到OptionSetValue
类型的各种属性(例如“PreferredContactMethodCode”)。如何从此OptionSetValue对象获取实际项目?
类似地,有许多类型为EntityReference
的属性,其中包含Id和LogicalName(我假设的实体名称)。我如何填充这样的属性 - 它是Get ...方法之一吗?这些必须单独调用,还是可以“预取”某些关系作为检索帐户实体的初始查询的一部分?
与各种IEnumerable<>类似。属性(可能对应于1-M实体关系),例如IEnumerable类型的名为“opportunity_customer_accounts”的属性。如何填充其中一个属性?并且(再次)这是否必须作为单独的查询/方法调用完成,还是可以“预取”?
答案 0 :(得分:3)
<强>提取强>
我不确定检索操作可以获得多少简单但是对于单个记录,上下文的用户可能有点过分。因此,您可以直接使用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(联系人,&#34; transactioncurrency_contact&#34;);
//动态读取相关实体 var currency = contact.GetRelatedEntity(&#34; transactioncurrency_contact&#34;); Console.WriteLine(currency.GetAttributeValue(&#34; currencyname&#34));
//静态读取相关实体 var currencyStatic = contact.transactioncurrency_contact; Console.WriteLine(currencyStatic.CurrencyName);
如果您没有使用OrganizationServiceContext
,可以尝试使用LinkedEntities
使用QueryExpression,虽然我从来没有这样做来填充早期绑定的实体,所以我不会知道它是否有效(也许有人会在答案中添加评论。)