public DynamicContentItem[] EvaluateItems(IEvaluationContext context) { var dynamicContext = context as DynamicContentEvaluationContext; if (dynamicContext == null) { throw new ArgumentException("The context must be a DynamicContentEvaluationContext."); } if (dynamicContext.ToDate == default(DateTime)) { dynamicContext.ToDate = DateTime.UtcNow; } var retVal = new List <DynamicContentItem>(); using (var repository = _repositoryFactory()) { var publishings = repository.PublishingGroups.Include(x => x.ContentItems) .Where(x => x.IsActive) .Where(x => x.StoreId == dynamicContext.StoreId) .Where(x => (x.StartDate == null || dynamicContext.ToDate >= x.StartDate) && (x.EndDate == null || x.EndDate >= dynamicContext.ToDate)) .Where(x => x.ContentPlaces.Any(y => y.ContentPlace.Name == dynamicContext.PlaceName)) .OrderBy(x => x.Priority) .ToArray(); //Get content items ids for publishings without ConditionExpression var contentItemIds = publishings.Where(x => x.ConditionExpression == null) .SelectMany(x => x.ContentItems) .Select(x => x.DynamicContentItemId) .ToList(); foreach (var publishing in publishings.Where(x => x.ConditionExpression != null)) { try { //Next step need filter assignments contains dynamicexpression var condition = _expressionSerializer.DeserializeExpression <Func <IEvaluationContext, bool> >(publishing.ConditionExpression); if (condition(context)) { contentItemIds.AddRange(publishing.ContentItems.Select(x => x.DynamicContentItemId)); } } catch (Exception ex) { _logger.Error(ex); } } retVal.AddRange(_dynamicContentService.GetContentItemsByIds(contentItemIds.ToArray())); } return(retVal.ToArray()); }
/// <summary> /// Evaluate pricelists for special context. All resulting pricelists ordered by priority /// </summary> /// <param name="evalContext"></param> /// <returns></returns> public virtual IEnumerable <coreModel.Pricelist> EvaluatePriceLists(coreModel.PriceEvaluationContext evalContext) { coreModel.PricelistAssignment[] assignmentsGetters() { var allAssignments = GetAllPricelistAssignments(); foreach (var assignment in allAssignments.Where(x => !string.IsNullOrEmpty(x.ConditionExpression))) { try { //Deserialize conditions assignment.Condition = _expressionSerializer.DeserializeExpression <Func <IEvaluationContext, bool> >(assignment.ConditionExpression); } catch (Exception ex) { _logger.Error(ex); } } return(allAssignments); } IQueryable <coreModel.PricelistAssignment> query = null; if (_cacheManager != null) { query = _cacheManager.Get("PricingServiceImpl.EvaluatePriceLists", "PricingModuleRegion", assignmentsGetters).AsQueryable(); } else { query = assignmentsGetters().AsQueryable(); } if (evalContext.CatalogId != null) { //filter by catalog query = query.Where(x => x.CatalogId == evalContext.CatalogId); } if (evalContext.Currency != null) { //filter by currency query = query.Where(x => x.Pricelist.Currency == evalContext.Currency.ToString()); } if (evalContext.CertainDate != null) { //filter by date expiration query = query.Where(x => (x.StartDate == null || evalContext.CertainDate >= x.StartDate) && (x.EndDate == null || x.EndDate > evalContext.CertainDate)); } var assignments = query.ToArray(); var assignmentsToReturn = assignments.Where(x => x.Condition == null).ToList(); foreach (var assignment in assignments.Where(x => x.Condition != null)) { try { if (assignment.Condition(evalContext)) { if (assignmentsToReturn.All(x => x.PricelistId != assignment.PricelistId)) { assignmentsToReturn.Add(assignment); } } } catch (Exception ex) { _logger.Error(ex); } } return(assignmentsToReturn.OrderByDescending(x => x.Priority).ThenByDescending(x => x.Name).Select(x => x.Pricelist)); }