检索单个实体

时间:2016-01-15 14:06:42

标签: dynamics-crm-2011 dynamics-crm dynamics-crm-2013

我需要从实体中提取单个值。它是一种全局设置,它与调用实体没有关系。但是当我尝试使用RetrieveMultiple时,我得到一个空的回复。

string name="objectToRetrieve";
QueryExpression qe = new QueryExpression  { EntityName = "new_setting", ColumnSet =new ColumnSet  ("new_name","new_value")};
qe.Criteria.AddCondition("new_name", ConditionOperator.Equal, name);
EntityCollection response = service.RetrieveMultiple(qe);

当我通过Guid检索它时一切正常。

Entity response = service.Retreve("new_setting", Guid.Parse("09BF9644-9BBA-E511-80FA-005056924035), new ColumnSet("new_value"));

如何在没有Guid的情况下获得它?

2 个答案:

答案 0 :(得分:1)

您的检索倍数已正确设置。所以有几种选择可能会发生......

  • 如果您没有从检索倍数中获取任何记录,那么您通过GUID检索的记录并不具有您认为的新名称。
  • 如果您正在获取记录并且它没有包含new_value的值,那么您可能会有多个具有相同new_name值的记录,并且您将获得不同的记录。检查GUID以查看它是否符合您的预期。
  • 您可能有一个在检索倍数上触发的插件,即修改返回的结果。
  • 您可能也可能遇到不同的组织,或者可能使用不具有阅读该实体的权利的其他用户,因为如果他们的组织。这是在插件或外部进程中运行吗?

您的代码是正确的,您必须考虑您所做的假设是不正确的。我首先要确保所返回实体的GUID符合您的预期。

答案 1 :(得分:-1)

当您需要按名称查询单个记录时,您的代码示例应该可以解决问题。当然,在查询系统中,实际上必须有一个名为" objectToRetrieve"的记录。我会首先在那里寻找错误。

考虑在记录状态上添加过滤器。在Dynamics CRM中,记录可以是“活动”或“非活动”。通常预计非活动记录将被排除在业务流程之外。

此外,当您的查询永远不会返回超过1行时,您可以将TopCount属性设置为1.这使SQL Server可以更有效地处理您的查询。

因此,您的第一个查询可能如下所示:

var query = new QueryExpression("new_setting") { TopCount = 1 };
query.ColumnSet.AddColumn("new_setting");
query.Criteria.AddCondition("new_name", ConditionOperator.Equal, name);
query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);

EntityCollection response = service.RetrieveMultiple(query);

// Assuming new_value is a string attribute:
Console.WriteLine(response.Entities[0].GetAttributeValue<string>("new_value"));

您的第二个代码段包含拼写错误,但这个想法没问题。当您知道正确的记录ID时,通过id检索它是最有效的方法。

Entity settingEntity = service.Retrieve("new_setting", new Guid("09BF9644-9BBA-E511-80FA-005056924035"), new ColumnSet("new_value"));