/// <summary> /// Returns MessageProductionData for each Recepient in template. /// </summary> public IEnumerable <MessageProductionData> Collect(IMessageTemplate templ) { var output = new List <MessageProductionData>(); //Migrate all needed data to memory, because it will be intensive processed var filters = templ.Filters != null?templ.Filters.ToArray() : new tblFilter[] { }; var wildcards = templ.Wildcards != null?templ.Wildcards.ToArray() : new tblWildcard[] { }; var recepients = templ.Recepients != null?templ.Recepients.ToArray() : new tblRecepientCard[] { }; var userInputedValues = templ.FilterValueContainers != null?templ.FilterValueContainers.ToArray() : new FilterValueContainer[] { }; Dictionary <int, ValueOperatorPair[]> filtsToValOps = GetFiltersActualSettings(filters, userInputedValues); var Condition = SqlPredicate.BuildAndNode(); if (filters.Length > 0) { foreach (var f in filters) { var orNode = SqlPredicate.BuildOrNode(); var valops = filtsToValOps[f.Id]; foreach (var valop in valops) { orNode.Append(SqlPredicate.BuildEndNode(f.Key, valop.Operator, valop.Value, f.Type)); } Condition.Append(orNode); } } //Build list of needed colomns var colomns = wildcards.Select(x => x.Key) .Concat(recepients.Select(x => x.EmailKey)) .Concat(recepients.Select(x => x.NameKey)) .Concat(recepients.Select(x => x.PhoneKey)).Distinct(); var sqlData = Manager.SqlLogic.FetchData(colomns, templ.TableWithKeysName, "dbo", Condition); var wildcardsSummed = wildcards.SelectMany(x => x.ToKeyValues()); bool IsSms = templ.IsSms; foreach (var rec in recepients) { var prodData = new MessageProductionData(); var GroupKey = IsSms ? rec.PhoneKey : rec.EmailKey; prodData.TextProductionData = sqlData .Where(x => !string.IsNullOrWhiteSpace(x[GroupKey].ToString())) .GroupBy(x => x[GroupKey].ToString()); prodData.wildCards = wildcardsSummed.Concat(rec.ToKeyValues()); output.Add(prodData); } return(output); }