public ExpressionParsingAttribute(string propertyName, ExpressionParsingOperator expressionOperator, string namesofCandidateProperties)
 {
     NameOfTheProperty          = propertyName;
     ExpressionOperatorUsed     = expressionOperator;
     NamesofCandidateProperties = namesofCandidateProperties;
 }
 public ExpressionParsingAttribute(string propertyName, ExpressionParsingOperator expressionOperator)
 {
     NameOfTheProperty      = propertyName;
     ExpressionOperatorUsed = expressionOperator;
 }
        private static HashSet <SqlWhereParameter> ExtractBackendParameters(Params source)
        {
            HashSet <SqlWhereParameter> result = new HashSet <SqlWhereParameter>();
            var type = source.GetType();

            foreach (var propertyInfo in type.GetProperties())
            {
                var propertyValue = propertyInfo.GetValue(source);
                if (propertyValue == null)
                {
                    continue;
                }
                var propertyName        = string.Empty;
                var propertyOperator    = string.Empty;
                var candidateProperties = string.Empty;
                ExpressionParsingOperator propertyOperatorEnum = ExpressionParsingOperator.Equals;

                foreach (var attr in propertyInfo.GetCustomAttributes(typeof(ExpressionParsingAttribute), false))
                {
                    var expressionAttribute = (ExpressionParsingAttribute)attr;
                    propertyName         = expressionAttribute.NameOfTheProperty;
                    propertyOperatorEnum = expressionAttribute.ExpressionOperatorUsed;
                    propertyOperator     = propertyOperatorEnum.GetDescription();
                    candidateProperties  = expressionAttribute.NamesofCandidateProperties;
                }

                if (string.IsNullOrEmpty(propertyName) || string.IsNullOrEmpty(propertyOperator))
                {
                    continue;
                }
                var parameter = new SqlWhereParameter()
                {
                    PropertyName  = propertyName,
                    PropertyValue = propertyValue,
                    Operator      = propertyOperatorEnum,
                };
                if (propertyOperatorEnum == ExpressionParsingOperator.NoComparing)
                {
                    if (propertyValue is bool && (bool)propertyValue)
                    {
                        parameter.IsNormalized = true;
                    }
                    else
                    {
                        continue;
                    }
                }
                if (propertyOperatorEnum == ExpressionParsingOperator.CandidatesContain)
                {
                    //parameter has no candidates
                    if (string.IsNullOrEmpty(candidateProperties))
                    {
                        continue;
                    }
                    //extract similarity candidates
                    else
                    {
                        parameter.CandidateNames = candidateProperties.Split(',').ToList();
                    }
                }
                //for int enums only
                Type u = Nullable.GetUnderlyingType(propertyInfo.PropertyType);
                if (u != null && u.IsEnum)
                {
                    parameter.PropertyValue = (int)propertyValue;
                }
                //convert enum list to int list
                if (propertyOperatorEnum == ExpressionParsingOperator.IsPartOfEnumList && propertyValue is IEnumerable && propertyValue.GetType().GetGenericArguments().First().IsEnum)
                {
                    parameter.PropertyValue = ((IEnumerable)propertyValue).ToDynamicArray().Select(x => (int)x).ToList();
                }
                //for datetime ranges
                if (propertyOperatorEnum == ExpressionParsingOperator.GreaterThan || propertyOperatorEnum == ExpressionParsingOperator.GreaterThanOrEquals && propertyValue is DateTime?)
                {
                    var date = ((DateTime?)propertyValue).Value;
                    parameter.PropertyValue = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second);
                }
                else if (propertyOperatorEnum == ExpressionParsingOperator.LessThan || propertyOperatorEnum == ExpressionParsingOperator.LessThanOrEquals && propertyValue is DateTime?)
                {
                    var date = ((DateTime?)propertyValue).Value;
                    parameter.PropertyValue = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);
                }
                result.Add(parameter);
            }
            return(result);
        }