Как получить только возвращающихся мастеров событий с помощью веб-служб Exchange?
Я использую представление CalendarItemType для извлечения элементов календаря. Единственные элементы, которые меня волнуют, - это те, которые я создал, и я знаю, что они все еженедельные повторяющиеся элементы. Я могу получить каждое отдельное событие, и из любого из них повторяющийся главный элемент, но я хотел бы сузить область моего поиска только теми пунктами, которые соответствуют моему шаблону.
Я пытаюсь использовать свойство Restriction на FindItemType для указания ограничения NotEqualTo с нулевой константой для calenderRecurrenceId. Это вызвало мою просьбу тайм-аут. До сих пор мне не удалось полностью загрузить рекурсии с помощью FindItemType и вам нужно использовать последующий вызов GetItemType, когда я нахожу событие, которое происходит в повторяющейся серии.
Вот код, с которого я начинаю. Код должен работать как с Exchange 2007, так и с Exchange 2010.
var findItemRequest = new FindItemType();
findItemRequest.ParentFolderIds = new DistinguishedFolderIdType[]
{
new DistinguishedFolderIdType()
};
((DistinguishedFolderIdType)findItemequest.ParentFolderIds[0]).Id = DistinguishedFolderIdNameType.calendar;
findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
var itemShapeDefinition = new ItemResponseShapeType(
{
BaseShape = DefaultShapeNamesType.AllProperties;
}
findItemRequest.Item = calenderView;
findItemRequest.ItemShape = itemShapeDefinition;
var findItemResponse = this.esb.FindItem( findItemRequest );
Кроме того, если вы знаете какой-либо хороший источник примеров (помимо тех, что содержатся в MSDN), я бы приветствовал их. Я набираю код другого в экстренной ситуации и стараюсь изучать веб-службы Exchange на лету.
Ответы
Ответ 1
Возможно, я вас не понимаю, и в этом случае я прошу прощения.
Вы НЕ используете CalendarView - вы используете обычный IndexedPageItemView, если все, что вам нужно, это элементы Master Recurring Calendar.
Вы используете CalendarView для расширения повторений для отдельных элементов. Однако компромисс с CalendarView не допускает ограничений, кроме даты начала и окончания. Отсутствуют.
Ответ 2
Найдено только свойство, в котором вы нуждаетесь, свойство RecurrenceStart. Поскольку EWS имеет ограничения, невозможно использовать все свойства в ограничении. Этот работает как ожидалось.
Ссылка: Найти основные повторяющиеся встречи
Ответ 3
Вы можете найти RecurrenceMaster, используя повторяющийся PidLid с ExtendedPropertyDefinition. Это работает, потому что, согласно их документации, "это свойство не должно существовать в отдельных элементах календаря экземпляра".
https://msdn.microsoft.com/en-us/library/cc842017.aspx
// https://msdn.microsoft.com/en-us/library/cc842017.aspx
ExtendedPropertyDefinition apptType = new ExtendedPropertyDefinition(
DefaultExtendedPropertySet.Appointment,
0x00008216, //PidLidAppointmentRecur
MapiPropertyType.Binary);
var restriction = new SearchFilter.Exists(apptType);
var iView = new ItemView(10);
var found = folder.FindItems(restriction, iView);
Я только что подтвердил это, сегодня, когда пересматривает какой-то старый код, который работает с Office365 EWS в облаке.
Ответ 4
Вы можете создавать собственные поисковые фильтры. Если вы выполняете поиск с определенного исходного свойства OR isRecurring, у вас есть самый простой способ... (SearchItems возвращает возвращающихся мастеров)
List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
SearchFilter.IsGreaterThanOrEqualTo startDatumFilter = new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, new DateTime(2012, 9, 16));
SearchFilter.IsEqualTo masterRecurringFilter = new SearchFilter.IsEqualTo(AppointmentSchema.IsRecurring, true);
searchFilterCollection.Add(startDatumFilter);
searchFilterCollection.Add(masterRecurringFilter);
SearchFilter finalFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.Or, searchFilterCollection);
ItemView itemView = new ItemView(100000);
itemView.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, AppointmentSchema.AppointmentType);
FindItemsResults<Item> items = _service.FindItems(WellKnownFolderName.Calendar, finalFilter, itemView);