public DynamicContentItem[] Evaluate(IDynamicContentEvaluationContext context) { DynamicContentItem[] retVal = null; if (!(context.ContextObject is Dictionary <string, object>)) { throw new ArgumentException("context.ContextObject must be a Dictionary"); } var query = GetPublishingGroups(); var places = GetPlaces(); var place = places.FirstOrDefault(x => x.Name == context.ContentPlace); if (place != null) { // sort content by type and priority query = query.OrderByDescending(x => x.Priority).ThenByDescending(x => x.Name); //filter by date expiration query = query.Where(x => (x.StartDate == null || context.CurrentDate >= x.StartDate) && (x.EndDate == null || x.EndDate >= context.CurrentDate)); //filter only active query = query.Where(x => x.IsActive); //filter by content places query = query.Where(x => x.ContentPlaces.Any(y => y.ContentPlace != null && y.ContentPlace.Name == context.ContentPlace)); //Evaluate query var current = query.ToArray(); //Evaluate condition expression Func <string, bool> conditionPredicate = (x) => { var condition = DeserializeExpression <Func <IEvaluationContext, bool> >(x); return(condition(context)); }; current = current.Where(x => string.IsNullOrEmpty(x.ConditionExpression) || conditionPredicate(x.ConditionExpression)).ToArray(); var list = new List <DynamicContentItem>(); var items = GetDynamicItems(); current.ToList().ForEach(x => x.ContentItems.ToList().ForEach(y => list.Add(items.Where(z => z.DynamicContentItemId == y.DynamicContentItemId)))); if (list.Count > 0) { retVal = list.ToArray(); } } return(retVal); }
public DynamicContentItem[] Evaluate(IDynamicContentEvaluationContext context) { DynamicContentItem[] retVal = null; if (!(context.ContextObject is Dictionary<string, object>)) throw new ArgumentException("context.ContextObject must be a Dictionary"); var query = GetPublishingGroups(); var places = GetPlaces(); var place = places.FirstOrDefault(x => x.Name == context.ContentPlace); if (place != null) { // sort content by type and priority query = query.OrderByDescending(x => x.Priority).ThenByDescending(x => x.Name); //filter by date expiration query = query.Where(x => (x.StartDate == null || context.CurrentDate >= x.StartDate) && (x.EndDate == null || x.EndDate >= context.CurrentDate)); //filter only active query = query.Where(x => x.IsActive); //filter by content places query = query.Where(x => x.ContentPlaces.Any(y => y.ContentPlace != null && y.ContentPlace.Name == context.ContentPlace)); //Evaluate query var current = query.ToArray(); //Evaluate condition expression Func<string, bool> conditionPredicate = (x) => { var condition = DeserializeExpression<Func<IEvaluationContext, bool>>(x); return condition(context); }; current = current.Where(x => string.IsNullOrEmpty(x.ConditionExpression) || conditionPredicate(x.ConditionExpression)).ToArray(); var list = new List<DynamicContentItem>(); var items = GetDynamicItems(); current.ToList().ForEach(x => x.ContentItems.ToList().ForEach(y => list.Add(items.Where(z => z.DynamicContentItemId == y.DynamicContentItemId)))); if (list.Count > 0) retVal = list.ToArray(); } return retVal; }