/// <summary> /// Lists the event. /// </summary> /// <param name="request">The request.</param> /// <remarks> /// - Удаляет FilterElement с source (DTStart, DTEnd)в запросе и формирует на основании их предикат /// позволяющий производить выборку по данным критериям из произвольной коллекции /// /// </remarks> /// <returns></returns> public static ListResponse ListEvent(CalendarEventListRequest request) { List<CalendarEventEntity> retVal = new List<CalendarEventEntity>(); TZID dtStartTZID = String.IsNullOrEmpty(request.DTStartTimeZoneId) ? null : new TZID(request.DTStartTimeZoneId); TZID dtEndTZID = String.IsNullOrEmpty(request.DTEndTimeZoneId) ? null : new TZID(request.DTEndTimeZoneId); //Заполняем FIlterElementCollection элементами исходного массива фильтров FilterElementCollection filterColl = new FilterElementCollection(); foreach (FilterElement filterEl in request.Filters) { filterColl.Add(filterEl); } AndBlockFilterElementPredicate<DateTime> andBlockDTStartFilterPredicate = new AndBlockFilterElementPredicate<DateTime>(); AndBlockFilterElementPredicate<DateTime> andBlockDTEndFilterPredicate = new AndBlockFilterElementPredicate<DateTime>(); ConstructPredicate(andBlockDTStartFilterPredicate, filterColl, CalendarEventEntity.FieldStart); ConstructPredicate(andBlockDTEndFilterPredicate, filterColl, CalendarEventEntity.FieldEnd); //Получаем все FilterElement которые связаны с датой и формируем на основе их дерево выражений foreach (FilterElement filterEl in FindFilterElementBySource(new string[] {CalendarEventEntity.FieldStart, CalendarEventEntity.FieldEnd}, request.Filters, true)) { //Рекурсивно удаляем найденный filterElement из исходного набора DeepRemoveFilter(filterColl, filterEl); } //добавляем дополнительные критерии AddExtraCriteria(filterColl); //Получаем список эвентов retVal.AddRange(ListEvents(filterColl, request)); //Применяем критерии отбора по датам начала и завершения взятые из первоначального запроса, и преобразованные //для отбора из коллекции EntityObjects retVal.RemoveAll(delegate(CalendarEventEntity eventEntity) { return !andBlockDTStartFilterPredicate.Evaluate(eventEntity.Start); }); retVal.RemoveAll(delegate(CalendarEventEntity eventEntity) { return !andBlockDTEndFilterPredicate.Evaluate(eventEntity.End); }); retVal.Sort(); return new ListResponse(retVal.ToArray()); }
public void ChangeIBN_Event() { CalendarEventListRequest listRequest = new CalendarEventListRequest(CalendarEventEntity.ClassName, new FilterElement[] { }); ListResponse listResp = (ListResponse)BusinessManager.Execute(listRequest); foreach (CalendarEventEntity eventEntity in listResp.EntityObjects) { eventEntity.PrimaryKeyId = (PrimaryKeyId)(VirtualEventId)eventEntity.PrimaryKeyId; eventEntity.Subject = "ibn subject"; UpdateRequest updateRequest = new UpdateRequest(eventEntity); BusinessManager.Update(eventEntity); break; } }
/// <summary> /// Возвращает список событий как виртуальных так и реальных. /// </summary> /// <param name="filterColl">The filter coll.</param> /// <param name="request">The request.</param> /// <returns></returns> private static IEnumerable<CalendarEventEntity> ListEvents(FilterElementCollection filterColl, CalendarEventListRequest request) { McEvent mcEvent = null; //Конструируем стандартный запрос LIST без критериев содержащих дату начала и конца события ListRequest moListRequest = (ListRequest)EventHelper.ConstructRequest<ListRequest>(request.Target, true); moListRequest.Filters = filterColl.ToArray(); moListRequest.Sorting = request.Sorting; //выполняем стандартный запрос ListResponse listResp = (ListResponse)BusinessManager.Execute(moListRequest); if (listResp != null && listResp.EntityObjects != null) { //Пробегаем по реальным events foreach (CalendarEventEntity entity in listResp.EntityObjects) { mcEvent = EventHelper.LoadCalEvent(entity.PrimaryKeyId.Value); if (mcEvent.IsReccuring) { iCalDateTime dtReccurBase = mcEvent.DTStart; //Пробегаем по виртуальным events foreach (Occurrence occur in mcEvent.GetOccurrences(mcEvent.DTStart, mcEvent.RecurrenceSeriesEndDate)) { //Создаем виртуальные события VirtualEventId vEventId = (VirtualEventId)entity.PrimaryKeyId; vEventId.RecurrenceId = EventHelper.iCalDateTime2Recurrence(dtReccurBase, occur.Period.StartTime); //Set virtual id mcEvent.UID = vEventId.ToString(); //Set recurrence-ID mcEvent.Recurrence_ID = occur.Period.StartTime; mcEvent.DTStart = occur.Period.StartTime; mcEvent.DTEnd = occur.Period.EndTime; EntityObjectHierarchy recurrenceEntity = EventHelper.ConstructEntityHierarchy(mcEvent); CalendarEventEntity occurEventEntity = recurrenceEntity.InnerEntity as CalendarEventEntity; if (occurEventEntity != null) { yield return occurEventEntity; } } } else { yield return entity; } } } }