private static void ParseRule <TEntity>(string entityType, RuleEntityContextMetadata ruleEntityMetadata,
                                                ref string ruleExpression,
                                                ref PlaceHolderTextParser place, string placeHolder, Dictionary <string, string> customplaceholders) where TEntity : RuleAwareEntity
        {
            string replacedString = "";
            bool   isDynamicProperty;

            if (placeHolder.Contains("."))
            {
                if (TryParseComplexProperty(entityType, ruleEntityMetadata, placeHolder, typeof(TEntity), customplaceholders,
                                            out replacedString))
                {
                    ruleExpression = Replace(ruleExpression, place.startplaceHolderpos, place.endPlaceHolderpos, replacedString);
                }
            }
            else if (TryParseSimpleProperty(entityType, ruleEntityMetadata, placeHolder, typeof(TEntity), out replacedString, out isDynamicProperty
                                            , customplaceholders))
            {
                ruleExpression = Replace(ruleExpression, place.startplaceHolderpos, place.endPlaceHolderpos,
                                         replacedString);
            }
            else
            {
                ruleExpression = Replace(ruleExpression, place.startplaceHolderpos, place.endPlaceHolderpos
                                         , placeHolder);
            }
            place = new PlaceHolderTextParser(ruleExpression);
        }
        internal static string ParseRulePlaceHolder <TEntity>(RuleEngineContext.RuleEngineContext context, string ruleExpression,
                                                              Dictionary <string, string> customplaceholders)
            where TEntity : RuleAwareEntity
        {
            PlaceHolderTextParser place = new PlaceHolderTextParser(ruleExpression);

            string placeHolder;
            string placeHolderWithParenthesis;

            while (place.NextPlaceHolder(out placeHolder, out placeHolderWithParenthesis))
            {
                ParseRule <TEntity>(context.RootEntityType, context.EntityContextMetadata, ref ruleExpression, ref place, placeHolder, customplaceholders);
            }

            return(ruleExpression);
        }
        public Delegate ParseGroupString(RuleEngineContext.RuleEngineContext contex, string placeHolderExpression)
        {
            IPlaceHolderParser <TEntity> placeHolderParser = RuleExpressionParserFactory.CreatePalceHolderParser <TEntity>();

            placeHolderParser.AddPlaceHolders(_placeholders);

            string[] expressions                 = placeHolderExpression.Split(',');
            int      propertyCounter             = 1;
            PlaceHolderTextParser place          = new PlaceHolderTextParser(placeHolderExpression);
            List <string>         lstExpressions = new List <string>();

            foreach (var expr in expressions)
            {
                try
                {
                    string parsedExpression = placeHolderParser.ParsePlaceHolder(contex, string.Format("({0}) as Prop{1}", expr,
                                                                                                       propertyCounter));
                    lstExpressions.Add(parsedExpression);
                    propertyCounter = propertyCounter + 1;
                }
                catch (System.Exception ex)
                {
                    throw new ExpressionParserException("GroupKeyExpressionParser", placeHolderExpression, contex.RuleEngineId, ex);
                }
            }

            var inputExpression = string.Format("new ({0})", string.Join(",", lstExpressions));

            try
            {
                var lamdaexpr = DynamicExpressionParser
                                .ParseLambda(contex.EntityContextMetadata.GetRuleParserConfig(), true, typeof(TEntity), null, inputExpression);

                return(lamdaexpr.Compile());
            }
            catch (Exception ex)
            {
                throw new ExpressionParserException("GroupKeyExpressionParser", placeHolderExpression, inputExpression, contex.RuleEngineId, ex);
            }
        }