如何以编程方式识别自定义字段?

How can recognize a custom field programmatically?

在 Microsoft Dynamics 365 中,我需要在实体中找到 自定义字段,我想使用 odata(rest api) 或获取实体的自定义字段带有用于动态目的的 SDK。 有什么方法可以通过编程方式找到吗?

您可以通过查询 publisher table 轻松枚举实例中所有发布者的自定义前缀,您想要名为 customizationprefix.

的列

检索到所有前缀后,您可以过滤 RetrieveEntityRequest 的结果以提取 name"<customizationprefix>_" 开头的所有列。

adxccmsdyn 等前缀来自 add-ons(门户网站、市场营销、现场服务等),您可能需要挑选列表前缀的数量取决于您的具体需求。

示例代码:

var client = new CrmServiceClient( /* ... */ );
const string ENTITY_TO_CHECK = "account";   // logical name

var prefixesQuery = new QueryExpression("publisher") { 
  ColumnSet = new ColumnSet("customizationprefix")
};
var prefixesData = client.RetrieveMultiple(prefixesQuery).Entities
  ?.Select(e => e.GetAttributeValue<string>("customizationprefix"));

Console.WriteLine("Publisher prefixes:");
foreach (var pd in prefixesData)
  Console.WriteLine("> {0}", pd);

var columnsQuery = new RetrieveEntityRequest
{
  LogicalName = ENTITY_TO_CHECK,
  EntityFilters = EntityFilters.Attributes,
  RetrieveAsIfPublished = true
};

var columnsData = (client.Execute(columnsQuery) as RetrieveEntityResponse)?.EntityMetadata?.Attributes
  ?.Where(col => prefixesData.Any(prefix => col.LogicalName.StartsWith($"{prefix}_")))
  .OrderBy(col => col.LogicalName);

Console.WriteLine("{0} custom fields: {1}", ENTITY_TO_CHECK, columnsData.Count());
foreach (var cd in columnsData.Take(1))
  Console.WriteLine("> {0}", cd.LogicalName);

Console.ReadLine();