/// <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())); }
FilterElementPredicate <T> IFactoryMethod <FilterElementPredicate <T> > .Create(object obj) { FilterElementPredicate <T> retVal = null; FilterElement filterEl = obj as FilterElement; if (filterEl != null) { if (filterEl.Type == FilterElementType.AndBlock) { retVal = new AndBlockFilterElementPredicate <T>(); foreach (FilterElement childFilterEl in filterEl.ChildElements) { retVal.AppendChildPredicate(childFilterEl); } } if (filterEl.Type == FilterElementType.OrBlock) { retVal = new OrBlockFilterElementPredicate <T>(); foreach (FilterElement childFilterEl in filterEl.ChildElements) { retVal.AppendChildPredicate(childFilterEl); } } else { IComparable <T> filterValue = TryConvertFilterValue(filterEl.Value) as IComparable <T>; if (filterValue != null) { Func <T, bool> functor = null; switch (filterEl.Type) { case FilterElementType.Equal: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) == 0); }; break; case FilterElementType.NotEqual: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) != 0); }; break; case FilterElementType.Less: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) > 0); }; break; case FilterElementType.LessOrEqual: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) >= 0); }; break; case FilterElementType.Greater: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) < 0); }; break; case FilterElementType.GreaterOrEqual: functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) <= 0); }; break; } if (functor != null) { retVal = new FilterElementPredicate <T>(filterEl, functor); } } } } return(retVal); }