private GroupChildRulesetDefaultRuleBuilder(RuleEngineContext.RuleEngineContext context, RulesetBuilder <TEntity> ruleSetBuilder,
                                                    GroupRuleSetBuilder <TEntity, TKey> groupRuleSetBuilder, IPropertyRuleExpressionParser <TEntity> propertyparser)
        {
            this._ruleSetBuilder      = ruleSetBuilder;
            this._groupRuleSetBuilder = groupRuleSetBuilder;

            _defaultProp = ruleSetBuilder.WithDefaultRule();
        }
        private static void TestGrouping(List <UserProfile> lst, IRuleEngineContext context)
        {
            Console.WriteLine("##########################################################################################");

            foreach (var item in lst)
            {
                Console.WriteLine("Employee: "
                                  + item.FirstName
                                  + " Bonus: "
                                  + item.DoubleProp("Bonus")
                                  + " Age: "
                                  + item.Age
                                  + " Salary:"
                                  + item.UserProfileDetails.Salary
                                  + " Overtime:" + item.Overtime);

                //item.Age = 40;
            }
            Console.WriteLine("##########################################################################################");
            Console.WriteLine();


            var grp = GroupRuleSetBuilder <UserProfile, UserProfile>
                      .Create(context)
                      //.WithAggregateInfo<double>("AvgBonus", AggregateFunction.Average, "{Bonus}*{UserProfileDetails.Salary}")
                      //.WithAggregateInfo<double>("AvgBonus", AggregateFunction.Average, "{Bonus}*{Age}")
                      //.WithAggregateInfo<double>("AvgBonus", AggregateFunction.Average, "{Bonus}*{UserProfileDetails.Dynamic}")
                      .WithAggregateInfo <double>("AvgBonus", AggregateFunction.Average, "{Bonus}")
                      .WithAggregateInfo <int>("MaxAge", AggregateFunction.Max, "{Age}")
                      //.WithAggregateInfo<int>("MaxAge", AggregateFunction.Max, "int({Age}*{AvgBonus})")
                      .WithAggregateInfo <double>("MinSalary", AggregateFunction.Min, "{UserProfileDetails.Salary}")
                      .WithAggregateInfo <int>("CountOfRecords", AggregateFunction.Count, "")
                      //.WithWhere("{Overtime} >100")
                      .WithPlaceHolder("SalaryCheck", "{AvgBonus} + {MaxSalary}")

                      //.WithGroupingKey("{Age} + 1, {UserProfileDetails.Salary}")
                      .WithGroupingKey("{UserProfileDetails.Dynamic}")
                      .WithRuleSet("Bonus Check")
                      .WithHaving("{MaxAge}<40")
                      .WithRule("{Bonus} > {AvgBonus}")
                      .SetProperty("BonusStatus", "Bonus is greater than Average Bonus")
                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .WithRule("{Bonus} < {AvgBonus}")
                      .SetProperty("BonusStatus", "Bonus is less than Average Bonus")
                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .DefaultRule()
                      .SetProperty("BonusStatus", "Bonus is equal to Average Bonus")
                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .WithRuleSet("Age Check")
                      .WithRule("{Age} < {MaxAge}")
                      .SetProperty("AgeStatus", "Age is less than Max Age")

                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .DefaultRule()
                      .SetProperty("AgeStatus", "Age is equal to Max Age")
                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .WithRuleSet("Salary Check")
                      .WithRule("{UserProfileDetails.Salary} > {MinSalary}")
                      .SetProperty("SalaryStatus", "Salary is Greater than min salary")
                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .WithRule("{UserProfileDetails.Salary} = {MinSalary}")
                      .SetProperty("SalaryStatus", "Salary is equal min Salary")
                      .SetAction(t => Console.WriteLine("Number of Records: " + t.GetPropertyOfType <int>("CountOfRecords")))
                      .Attach()
                      .Attach()
                      .Compile();

            grp.Execute(lst);

            foreach (var item in lst)
            {
                Console.WriteLine("Name:" + item.FirstName);
                Console.WriteLine("Overtime:" + item.Overtime);
                Console.WriteLine("--------------------------------------");
                Console.WriteLine("Salary Status: "
                                  + item.StringProp("SalaryStatus")
                                  + "\r\nAge Status: "
                                  + item.StringProp("AgeStatus")
                                  + "\r\nBonus Status: "
                                  + item.StringProp("BonusStatus")
                                  + "\r\nMax Age: "
                                  + item.IntProp("MaxAge")
                                  );

                Console.WriteLine();
            }
        }
 internal static GroupChildRulesetDefaultRuleBuilder <TEntity, TKey> Create(RuleEngineContext.RuleEngineContext context, RulesetBuilder <TEntity> ruleSetBuilder,
                                                                            GroupRuleSetBuilder <TEntity, TKey> groupRuleSetBuilder, IPropertyRuleExpressionParser <TEntity> propertyparser)
 {
     return(new GroupChildRulesetDefaultRuleBuilder <TEntity, TKey>(context, ruleSetBuilder, groupRuleSetBuilder, propertyparser));
 }