[英]Dynamics CRM : Retrieve multiple appointments for a systemuser
我正在尝试使用RetrieveMultiple方法和查询表达式来获取系统用户的所有约会。 范例:
WhoAmIRequest userRequest = new WhoAmIRequest();
WhoAmIResponse userResponse = (WhoAmIResponse)_serviceProxy.Execute(userRequest);
QueryExpression qe = new QueryExpression();
qe.EntityName = "systemuser";
...
slos.RetrieveMultiple(qe);
我可以从systemuser实体检索systemuser的所有约会(所有者,组织者,必需的与会者,可选的与会者)吗?
还是我必须检索CRM的所有约会并添加条件才能知道用户是所有者,组织者,必需参与者还是可选参与者?
最后,我正在使用SOAP Logger,这是生成SOAP请求的最佳方法吗?
您将需要使用appointment
和systemuser
之间的关系实体activitypointer
systemuser
。 正如您在我的示例中看到的那样,这使事情有些复杂。
至少有两种可能的方式来构建所需的查询:
1)如您所料,您可以按systemuserid过滤约会:
var qe = new QueryExpression
{
EntityName = "appointment",
ColumnSet = new ColumnSet("subject"),
LinkEntities =
{
new LinkEntity
{
EntityAlias = "ap",
JoinOperator = JoinOperator.Inner,
Columns = new ColumnSet(false),
LinkFromEntityName = "appointment",
LinkFromAttributeName = "activityid",
LinkToEntityName = "activityparty",
LinkToAttributeName = "activityid",
LinkCriteria = new FilterExpression
{
Conditions =
{
new ConditionExpression("partyid", ConditionOperator.Equal, userid),
},
},
},
},
};
2)您可以通过systemuserid查询systemuser并将约会添加为链接的实体(例如sql查询中的JOIN):
var qe2 = new QueryExpression
{
EntityName = "systemuser",
ColumnSet = new ColumnSet(false),
LinkEntities =
{
new LinkEntity
{
EntityAlias = "ap",
Columns = new ColumnSet(false),
JoinOperator = JoinOperator.Inner,
LinkFromEntityName = "systemuser",
LinkFromAttributeName = "systemuserid",
LinkToEntityName = "activityparty",
LinkToAttributeName = "partyid",
LinkEntities =
{
new LinkEntity
{
EntityAlias = "a",
Columns = new ColumnSet("subject"),
JoinOperator = JoinOperator.Inner,
LinkFromEntityName = "activityparty",
LinkFromAttributeName = "activityid",
LinkToEntityName = "appointment",
LinkToAttributeName = "activityid",
},
},
},
},
Criteria = new FilterExpression
{
Conditions =
{
new ConditionExpression("systemuserid", ConditionOperator.Equal, userid),
},
},
};
关于参与角色的过滤器,您必须在activitypointer
的participationtypemask
上添加一个条件:
// user is Organizer, Owner, required or optional Attendee
ConditionExpression("participationtypemask", ConditionOperator.In, new int[] { 5, 6, 7, 9 }),
有了这个表达,我现在没有收到任何约会:
QueryExpression qe = new QueryExpression
{
EntityName = "appointment",
ColumnSet = new ColumnSet("activityid", "subject", "scheduledstart", "scheduledend", "location", "description"),
Criteria = new FilterExpression
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression("scheduledend", ConditionOperator.GreaterThan, startTime),
new ConditionExpression("scheduledstart", ConditionOperator.LessThan, endTime)
}
},
LinkEntities =
{
new LinkEntity
{
LinkFromEntityName = "activitypointer",
LinkFromAttributeName = "activityid",
LinkToEntityName = "activityparty",
LinkToAttributeName = "activityid",
LinkCriteria = new FilterExpression
{
FilterOperator = LogicalOperator.And,
Conditions =
{
new ConditionExpression("participationtypemask", ConditionOperator.In, new int[] { 5, 6, 7, 9 }),
new ConditionExpression("partyid", ConditionOperator.Equal, userResponse.UserId)
}
}
},
new LinkEntity
{
EntityAlias = "requiredattendees",
Columns = new ColumnSet(false),
JoinOperator = JoinOperator.Inner,
LinkFromEntityName = "activitypointer",
LinkFromAttributeName = "activityid",
LinkToEntityName = "activityparty",
LinkToAttributeName = "activityid",
LinkCriteria = new FilterExpression
{
Conditions =
{
new ConditionExpression("participationtypemask", ConditionOperator.Equal, 5)
}
},
LinkEntities =
{
new LinkEntity
{
EntityAlias = "contact",
Columns = new ColumnSet("fullname"),
JoinOperator = JoinOperator.Inner,
LinkFromEntityName = "activityparty",
LinkFromAttributeName = "activityid",
LinkToEntityName = "contact",
LinkToAttributeName = "contactid"
},
}
}
}
};
qe.Distinct = true;
slos.RetrieveMultiple(qe);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.