示例#1
0
        /// <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);
        }