Mil*_*ton 10 dynamics-crm dynamics-crm-2011
我正在尝试从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);
Run Code Online (Sandbox Code Playgroud)
在变量响应中,我可以看到EntityCollection属性,但在内部,相关实体总是空的.

我想知道是否可以使用RetrieveMultipleRequest检索具有相关实体的给定实体的集合,而不是使用RetrieveRequest逐个检索.
一种检索相关实体数据的方法 - 将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);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用上面指定的EntityAlias访问相关实体的属性:
foreach (Entity entity in entities.Entities)
{
if ((long)(entity["related.versionnumber"] as AliasedValue).Value > 0)
{
stop = false;
}
}
Run Code Online (Sandbox Code Playgroud)
的RetrieveMultipleRequest是用于返回一个特定类型的实体的多个实例.我花了一年时间使用来自C#的CRM SDK,我发现无法在单个查询中填充这些相关的实体集合.这基本上为您提供了两个选项:
像SergeyS推荐的那样使用AliasedValue.请记住查询时1:许多关系,请注意您可能会为同一父实体返回多个结果.这是我大部分时间都在使用的.
对要访问的每个关系执行第二次查询.如果您可以根据第一个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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9046 次 |
| 最近记录: |