关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复159或者20151013可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!
Dynamics CRM是基于元数据(metadata)的信息系统,做一些比较通用的功能时候需要查询元数据,本篇博文先介绍一个简单的例子,查询实体主字段(Primary Attribute)的名称及其值。
我们知道新建实体的主字段的名称总是开发者前缀加上 _name,但是有些标准实体却不是,比如联系人实体(contact),用户实体(systemuser)等等,但是有一个共同点就是,主字段的字段类型总是单行文本,查找字段显示的是查找实体的主字段的值。
在CRM中查看实体的主字段很方便,在解决方案中点击实体,切换到 主字段 这个tabpage即可。
当然还可以通过查看实体元数据中的 PrimaryNameAttribute 属性来确定。
本篇博文介绍的通过代码来查看并获取值,我们先来看一个标准的实体,也就是用户实体,代码如下:
static void Main(string[] args) { var service = GetOrganizationService(); WhoAmIRequest whoAmIRequest = new WhoAmIRequest(); WhoAmIResponse whoAmIResponse = service.Execute(whoAmIRequest) as WhoAmIResponse; const string entityLogicalName = "systemuser"; Guid entityId = whoAmIResponse.UserId; RetrieveEntityRequest request = new RetrieveEntityRequest { EntityFilters = EntityFilters.Entity, LogicalName = entityLogicalName }; RetrieveEntityResponse response = service.Execute(request) as RetrieveEntityResponse; string primaryNameAttribute = response.EntityMetadata.PrimaryNameAttribute; Console.WriteLine("实体逻辑名称为" + entityLogicalName + "的主字段是" + primaryNameAttribute); Entity entity = service.Retrieve(entityLogicalName, entityId, new ColumnSet(primaryNameAttribute)); Console.WriteLine("ID为" + entityId.ToString() + ",实体名称为" + entityLogicalName + "的主字段的值是" + entity.GetAttributeValue<string>(primaryNameAttribute)); Console.WriteLine("程序运行完成!"); Console.ReadKey(); }
代码运行结果如下:
我们再拿一个自定义的实体来做试验,代码如下:
static void Main(string[] args) { var service = GetOrganizationService(); WhoAmIRequest whoAmIRequest = new WhoAmIRequest(); WhoAmIResponse whoAmIResponse = service.Execute(whoAmIRequest) as WhoAmIResponse; const string entityLogicalName = "new_test"; Guid entityId = new Guid("D7D08CEA-5051-E511-80D2-000D3A802FAC"); RetrieveEntityRequest request = new RetrieveEntityRequest { EntityFilters = EntityFilters.Entity, LogicalName = entityLogicalName }; RetrieveEntityResponse response = service.Execute(request) as RetrieveEntityResponse; string primaryNameAttribute = response.EntityMetadata.PrimaryNameAttribute; Console.WriteLine("实体逻辑名称为" + entityLogicalName + "的主字段是" + primaryNameAttribute); Entity entity = service.Retrieve(entityLogicalName, entityId, new ColumnSet(primaryNameAttribute)); Console.WriteLine("ID为" + entityId.ToString() + ",实体名称为" + entityLogicalName + "的主字段的值是" + entity.GetAttributeValue<string>(primaryNameAttribute)); Console.WriteLine("程序运行完成!"); Console.ReadKey(); }
运行结果如下:
都是符合要求的。