2015-10-22 1 views
0

Я пытаюсь получить все встречи для системного пользователя с помощью метода RetrieveMultiple и выражения запроса. Пример:Dynamics CRM: получение нескольких назначений для системного пользователя

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?

ответ

2

Вам необходимо использовать объект связи activitypointer между appointment и systemuser. Как вы увидите в моих примерах, это немного осложняет ситуацию.

Есть как минимум 2 возможных способов создания нужного запроса:

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) Вы можете запросить systemuser по systemuserid и добавить назначения в качестве связанного объекта (например, объединение в запросе SQL):

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

Что касается фильтра для роли участия, вы должны будете добавить условие на participationtypemask на activitypointer:

// user is Organizer, Owner, required or optional Attendee 
ConditionExpression("participationtypemask", ConditionOperator.In, new int[] { 5, 6, 7, 9 }), 
+0

Спасибо большое за ответ, это экономит мой день. Еще одна вещь, если набор «организатор» в ColumnSet, он извлекает EntityCollection со всеми полями. Можно ли указать поля, которые я хочу в организаторе? – bidou88

+1

Конечно, это возможно - вместо простого указания «субъекта» *, как в моем примере, вы можете просто установить «новый ColumnSet (true)», который будет извлекать все поля. Если вам нужно построить QueryExpression на основе условий, просто разделите его и установите необходимые свойства. Я склонен строить QueryExpression так, как показано, потому что imho делает их более читаемыми, как это делают sql-запросы. – Filburt

+0

Спасибо, я не очень хорошо формулировал свой вопрос. Если добавить организатор добавления в свой ColumnSet, он получает организатор, но со всеми полями, прикрепленными к организатору. То, что я хотел сделать, это иметь только определенные поля в организаторе. Я не знаю, ясно ли это? – bidou88

0

С помощью этого выражения, я не получаю никаких назначений в настоящее время:

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

На первый взгляд я бы сказал, что теперь ваша проблема заключается в том, что вы указываете 'JoinOperator.Inner' на ваших * обязательных пользователях * и * на контакте * LinkEntities (должен быть JoinOperator.LeftOuter). Если я нахожусь с неожиданными результатами, как это, я пытаюсь восстановить запрос с помощью «Расширенный поиск» и проверить FetchXml позади него. Это обычно проясняет ситуацию довольно быстро. Примечание стороны. Возможно, вы захотите перенести содержимое этого «ответа» на свое оригинальное сообщение или опубликовать в качестве нового вопроса. – Filburt