Dynamics CRM:检索系统用户的多个约会

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);

我可以从系统用户实体中检索系统用户(所有者、组织者、必需的参加者、可选的参加者)的所有约会吗?

或者我是否必须检索 CRM 的所有约会并添加条件以了解用户是所有者、组织者、必需的还是可选的参与者?

最后,我正在使用 SOAP Logger,这是生成 SOAP 请求的最佳方式吗?

您需要在 appointmentsystemuser 之间使用关系实体 activitypointer。正如您将在我的示例中看到的那样,这让事情变得有点复杂。

至少有 2 种可能的方法来构建您想要的查询:

1) 正如您已经想到的,您可以按系统用户 ID 过滤约会:

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),
        },
    },
};

关于参与角色的过滤器,您必须在 activitypointerparticipationtypemask 上添加条件:

// 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);