我正在尝试获取所有实体的字段模式名称而不查询现有记录。我什么都不知道。
另外,如何使用QueryExpression获取它,导致它检索包含一些信息的所有字段?
Andrii,我正在尝试做这样的事情
var query = new QueryExpression {EntityName = "", ColumnSet = new ColumnSet(true)};
var retrieve = service.RetrieveMultiple(query);
答案 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。