CRM Dynamics SDK如何访问相关数据

时间:2015-05-22 15:17:41

标签: dynamics-crm-2013

我正在使用由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”的属性。如何填充其中一个属性?并且(再次)这是否必须作为单独的查询/方法调用完成,还是可以“预取”?

1 个答案:

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