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;
        }