如何获得CRM 2011的所有实体领域?

时间:2014-02-13 13:05:10

标签: c# javascript dynamics-crm-2011 entity field

我正在尝试获取所有实体的字段模式名称而不查询现有记录。我什么都不知道。

另外,如何使用QueryExpression获取它,导致它检索包含一些信息的所有字段?

Andrii,我正在尝试做这样的事情

var query = new QueryExpression {EntityName = "", ColumnSet = new ColumnSet(true)};
var retrieve = service.RetrieveMultiple(query);

3 个答案:

答案 0 :(得分:4)

如果您拥有CRM SDK(http://www.microsoft.com/en-us/download/details.aspx?id=24004),您将在SDK \ Bin文件夹中找到名为“Crmsvcutil.exe”的实用程序。此可执行文件将生成表示每个CRM实体及其字段的类。然后,您可以使用type.GetFields()方法在代码中派生这些类的字段。使用crmsvcutil创建这些类后,可以使用LINQ查询根据满足您需求的任何条件查询CRM数据,包括非空字段。尝试使用QueryExpression时遇到的问题是您必须手动定义字段,如下所示:

QueryExpression query = new QueryExpression("contact");
query.ColumnSet.AddColumns("firstname", "lastname");
query.Criteria.AddFilter(filter1);

答案 1 :(得分:4)

我正在寻找类似的东西,并最终烹饪出一种有用的方法:

/// <summary>
/// Retrieves an entity's attributes.
/// </summary>
/// <param name="entityName">entity's name</param>
/// <param name="languageId">return display names of such language code</param>
/// <param name="xrm">xrmservicecontext object</param>
/// <returns>Dictionary<string, string></returns>
public static Dictionary<string, string> GetAttributes(string entityName, int languageId, XrmServiceContext xrm)
{
    Dictionary<string, string> attributesData = new Dictionary<string, string>();

    RetrieveEntityRequest metaDataRequest = new RetrieveEntityRequest();
    RetrieveEntityResponse metaDataResponse = new RetrieveEntityResponse();
    metaDataRequest.EntityFilters = EntityFilters.Attributes;
    metaDataRequest.LogicalName = entityName;
    metaDataResponse = (RetrieveEntityResponse)xrm.Execute(metaDataRequest);

    foreach (AttributeMetadata a in metaDataResponse.EntityMetadata.Attributes)
    {
        //if more than one label for said attribute, get the one matching the languade code we want...
        if (a.DisplayName.LocalizedLabels.Count() > 1)
            attributesData.Add(a.LogicalName, a.DisplayName.LocalizedLabels.Where(x=>x.LanguageCode == languageId).SingleOrDefault().Label);

        //else, get the only one available regardless of languade code...
        if (a.DisplayName.LocalizedLabels.Count() == 1)
            attributesData.Add(a.LogicalName, a.DisplayName.LocalizedLabels[0].Label);
    }

        return attributesData;
}

您当然可以修改它以返回有关实体属性的所需信息,但在我的情况下,我正在寻找一种方法来替换CRM SDK用于自动生成的属性的逻辑名称gridview列具有属性的实际显示名称。

答案 2 :(得分:2)

您应该尝试使用RetrieveEntity message来获取所有实体字段。如果它等于null,您将无法获取字段。你将不得不分析 - 如果内部集合中的属性 - 它包含值,否则它等于null。