11

我正在尝试从 CRM 中检索实体列表,但我希望每个实体都具有相关实体。到目前为止,我有以下代码:

FilterExpression filterExpression = new FilterExpression();
ConditionExpression condition = new ConditionExpression(Constants.ModifiedOnAttribute, ConditionOperator.GreaterEqual, lastSync);
filterExpression.AddCondition(condition);

QueryExpression query = new QueryExpression()
{
     EntityName = entityName,
     ColumnSet = new ColumnSet(attributesMetadata.Select(att => att.Name).ToArray<string>()),
     Criteria = filterExpression,
     Distinct = false,
     NoLock = true
};

RetrieveMultipleRequest multipleRequest = new RetrieveMultipleRequest();
multipleRequest.Query = queryExpression;

RetrieveMultipleResponse response = (RetrieveMultipleResponse)proxy.Execute(multipleRequest);

在变量响应中,我可以看到 EntityCollection 属性,但在内部,相关实体总是为空。

相关实体计数为 0

我想知道是否可以使用 RetrieveMultipleRequest 检索给定实体的集合以及相关实体,而不是使用 RetrieveRequest 逐个检索。

4

2 回答 2

9

一种检索相关实体数据的方法 - 将 LinkEntities 添加到您的查询中。下面的示例将使您了解如何进行此操作:

LinkEntity linkEntity = new LinkEntity("email", "new_emails", "activityid", "new_relatedemail", JoinOperator.Inner);
linkEntity.Columns.AddColumn("versionnumber");
linkEntity.Columns.AddColumn("new_emailsid");
linkEntity.EntityAlias = "related";

query = new QueryExpression("email");
query.ColumnSet.AddColumn("activityid");
query.ColumnSet.AddColumn("versionnumber");
query.Criteria.AddCondition("modifiedon", ConditionOperator.NotNull);
query.LinkEntities.Add(linkEntity);

然后您可以使用上面指定的 EntityAlias 访问相关实体的属性:

foreach (Entity entity in entities.Entities)
{
    if ((long)(entity["related.versionnumber"] as AliasedValue).Value > 0)
    {
        stop = false;
    }
}
于 2012-12-04T20:05:23.947 回答
5

RetrieveMultipleRequest用于返回特定类型实体的多个实例。我已经使用 C# 中的 CRM SDK 花了一年时间,但我发现无法在单个查询中填充这些相关的实体集合。这基本上给你留下了两个选择:

  1. 按照 SergeyS 的建议使用 AliasedValue。请记住,在查询 1:Many 关系时,请注意您可能会为同一个父实体返回多个结果。这是我大部分时间使用的。

  2. 对您要访问的每个关系执行第二次查询。如果您可以根据第一个IN查询的结果在第二个查询中使用语句,而不是为第一个查询的每个结果执行单独的查询,您可能会获得更好的性能。

下面是一些伪代码来显示差异。

var contacts = GetContacts();

// One Request to get the cars for the contacts
var cars = GetCarsWhereContactIdIn(contacts.Select( c => c.new_ContactId));

foreach(var c in contacts){
    c.new_Cars.AddRange(cars.where(car => car.new_contactId = c.ContactId));
}

// Verses
var contacts = GetContacts();

foreach(var c in contacts){
    // One Request for each contact
    c.new_Cars.AddRange(GetCarsForContact(c.ContactId));
}
于 2012-12-04T21:18:38.760 回答