async Task <IEnumerable <ParameterResponse> > getParametersForProduct(int productId)
        {
            //fetch all parameters for product
            var fetchedParameters = await _context.Parameter.Where(p => p.ProductId == productId).ToListAsync();

            var parameters = new ParameterResponse[fetchedParameters.Count];

            for (int j = 0; j < fetchedParameters.Count; j++)
            {
                var parameter = fetchedParameters[j];

                //fetch all values for parameter
                var fetchedParametersValues = await _context.ParameterValue.Where(p => p.ParameterId == parameter.ObjectId).ToListAsync();

                //add all values to parameter
                var values = new ParameterValueResponse[fetchedParametersValues.Count];
                for (int i = 0; i < fetchedParametersValues.Count; i++)
                {
                    var value = fetchedParametersValues[i];

                    values[i] = (new ParameterValueResponse {
                        id = value.ObjectId,
                        parameterId = parameter.ObjectId,
                        name = value.Name,
                    });
                }

                //populate parameter with value
                parameters[j] = (new ParameterResponse {
                    id = parameter.ObjectId,
                    name = parameter.Name,
                    parameterValues = values,
                });
            }
            return(parameters);
        }
        async Task <IEnumerable <RuleResponse> > getRulesForParameters(int[] parameterIds)
        {
            var rules   = new List <RuleResponse>();
            var ruleIds = new List <int>();

            //get all parameters
            var allDisallowedParameters = new List <DisallowedParameter>();

            foreach (var parameterId in parameterIds)
            {
                var fetchedParameters = await _context.DisallowedParameter
                                        .Where(rule => rule.ParameterId == parameterId)
                                        .ToListAsync();

                allDisallowedParameters.AddRange(fetchedParameters);
            }

            //get all rule names
            var allDisallowedRuleNames = new List <DisallowedRule>();

            foreach (var disallowedParameter in allDisallowedParameters)
            {
                var fetchedRuleNames = await _context.DisallowedRule
                                       .Where(rule => rule.ObjectId == disallowedParameter.DisallowedRuleId)
                                       .ToListAsync();

                allDisallowedRuleNames.AddRange(fetchedRuleNames);
            }

            //get all rule values
            var allDisallowedRuleValues = new List <DisallowedValue>();

            foreach (var disallowedParameter in allDisallowedParameters)
            {
                var fetchedRuleValues = await _context.DisallowedValue
                                        .Where(value => value.DisallowedParameterId == disallowedParameter.ParameterId)
                                        .ToListAsync();

                allDisallowedRuleValues.AddRange(fetchedRuleValues);
            }

            //remove duplicates
            var disallowedRuleNames = allDisallowedRuleNames.Distinct().ToList();

            //add rules
            foreach (var disallowedRule in disallowedRuleNames)
            {
                //create value list
                var incompatableValues = new List <ParameterValueResponse>();

                //get all parameter with rule id
                var ruleParameters = allDisallowedParameters.FindAll(p => p.DisallowedRuleId == disallowedRule.ObjectId);

                foreach (var param in ruleParameters)
                {
                    //get all values with param ids
                    var ruleValues = allDisallowedRuleValues.FindAll(v => v.DisallowedParameterId == param.ParameterId);
                    System.Console.WriteLine("{0}, param {1}, have {2} conflicting values", disallowedRule.Name, param.ParameterId, ruleValues.Count);

                    foreach (var value in ruleValues)
                    {
                        if (!incompatableValues.Exists(v => v.id == value.ParameterValueId))
                        {
                            //add values
                            var valueResponse = new ParameterValueResponse {
                                id          = value.ParameterValueId,
                                parameterId = value.DisallowedParameterId,
                                name        = null
                            };

                            incompatableValues.Add(valueResponse);
                        }
                    }
                }

                //map rules
                var rule = new RuleResponse {
                    id   = disallowedRule.ObjectId,
                    name = disallowedRule.Name,
                    incompatableValues = incompatableValues.ToArray(),
                };

                rules.Add(rule);
                System.Console.WriteLine("");
            }
            return(rules);
        }