Вам необходимо использовать объект связи 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 }),
Спасибо большое за ответ, это экономит мой день. Еще одна вещь, если набор «организатор» в ColumnSet, он извлекает EntityCollection со всеми полями. Можно ли указать поля, которые я хочу в организаторе? – bidou88
Конечно, это возможно - вместо простого указания «субъекта» *, как в моем примере, вы можете просто установить «новый ColumnSet (true)», который будет извлекать все поля. Если вам нужно построить QueryExpression на основе условий, просто разделите его и установите необходимые свойства. Я склонен строить QueryExpression так, как показано, потому что imho делает их более читаемыми, как это делают sql-запросы. – Filburt
Спасибо, я не очень хорошо формулировал свой вопрос. Если добавить организатор добавления в свой ColumnSet, он получает организатор, но со всеми полями, прикрепленными к организатору. То, что я хотел сделать, это иметь только определенные поля в организаторе. Я не знаю, ясно ли это? – bidou88