仅获取OData中实体的属性定义

仅获取OData中实体的属性定义,odata,dynamics-crm,Odata,Dynamics Crm,我正在开发一个需要与OData服务(确切地说是Microsoft Dynamics CRM)通信的应用程序。我有一个要求,我只需要知道实体的所有属性 e、 g 返回所有联系人,但我只需要联系人的属性定义 现在[Organization URI]/api/data/v8.1/contacts返回带有值的JSON,但是我看到的是contacts实体的模式。它应该返回它拥有的所有属性(例如,firstname,lastname)以及可能的属性类型 我尝试使用$metadata,但没有任何运气。是否可以

我正在开发一个需要与OData服务(确切地说是Microsoft Dynamics CRM)通信的应用程序。我有一个要求,我只需要知道实体的所有属性

e、 g

返回所有联系人,但我只需要联系人的属性定义

现在
[Organization URI]/api/data/v8.1/contacts
返回带有值的JSON,但是我看到的是contacts实体的模式。它应该返回它拥有的所有属性(例如,
firstname
lastname
)以及可能的属性类型

我尝试使用
$metadata
,但没有任何运气。是否可以仅获取有关实体的信息


任何帮助都将不胜感激

如果您使用的是Web Api(看起来像),那么您可以检索
EntityMetadata
,它具有
AttributeMetadata
的导航属性,该属性将描述属性(也称为字段、属性)

[Organization URI]/api/data/v8.1/EntityDefinitions

例如:
GET[Organization URI]/api/data/v8.1/EntityDefinitions?$select=DisplayName,IsKnowledgeManagementEnabled,EntitySetName&$filter=SchemaName eq'Contact'HTTP/1.1

有关更多示例,请参见。前面的答案很接近,但您需要
$expand=Attributes
来获取属性列表。此外,它还可以获取您希望在联系人上过滤的所有实体

GET [Organization URI]/api/data/v8.1/EntityDefinitions?$select=LogicalName&**$expand=Attributes($select=LogicalName)**&$filter=SchemaName eq 'Contact'
在返回的JSON中,您可以在

value[0].Attributes
这是一个数组。在本例中,I
$select=LogicalName
,因此每个属性都具有属性LogicalName(以及作为该属性GUID的MetadataId)

因此,第一个
$select
用于实体的属性。
$expand
告诉CRM包含这些属性。内部
$select
告诉属性返回哪些字段。
$filter
确保他们只返回联系人的所有元数据。

提供的答案描述了如何获取实体的元数据,从技术上讲,不包含给定实体的所有定义。 但是,当使用Web API时,另一种方法是下载Web API的CSDL元数据文档($metadata),并查找contacts entityType的定义。这是用于生成此文档的数据,并提供Web API使用的特定定义

你会发现结构上有差异。i、 e.元数据定义LookupAttributeMetadata属性,但Web API使用单值导航属性和只读“查找属性”


有关了解Web API$元数据的信息,请参见

获取实体信息的唯一方法是从服务元数据。您有权访问代码中的元数据对象吗?尝试调用“联系人”的EntityDefinitions时,我找不到导航属性。你能帮我一点忙吗?非常感谢你抽出时间。我已经试过了。我想得到的是那个实体的属性。e、 g.联系人具有
firstname
lastname
属性。我想得到那个实体的模式。非常感谢你们的详细回答。一旦我被允许,我会马上给你赏金:-)虽然这对我很有帮助,但我想再问一个问题。目前我获得了所有270个属性,是否有任何方法可以获得重要属性或只能从UI编辑的属性?您可以检索AttributeOf(api/data/v8.1/EntityDefinitions?$select=LogicalName&$expand=Attributes($select=LogicalName,AttributeOf)&$filter=SchemaName eq'Contact')并排除AttributeOf不为null的字段。这些是逻辑列(如GUID字段的名称),实际上并不存储在表中。对于表单上的字段,您必须检索此实体的表单(SystemForm):/api/data/v8.1/systemforms?$select=formxml&$filter=objecttypecode eq‘contact’并键入eq 2和formactivationstate eq 1。这是一个总体简化,因为……可以通过安全性将不同的表单分配给不同的用户。多个表单可应用于单个用户。但是对于开箱即用的CRM,这应该会得到一个单一的结果。然后,您将解析XML(formxml),寻找与上面获取的元数据交叉引用控制节点的datafieldname属性。
value[0].Attributes