private void PredicateBuilderByExpressions(
            IDictionary <PropertyInfo, SearchPredicatePropertyInfo> propertyInfoByPropName)
        {
            foreach (var(prop, searchPredicatePropertyInfo) in propertyInfoByPropName)
            {
                PropertyOrField     = searchPredicatePropertyInfo.PropertyOrField;
                EntityName          = searchPredicatePropertyInfo.EntityName;
                FilterPropertyValue = searchPredicatePropertyInfo.PropertyValue;
                FilterPropertyType  = prop.PropertyType;
                EntityPropertyType  = searchPredicatePropertyInfo.InstanceTypeOfProperty
                                      .GetProperty(EntityName.ToUpper())?.PropertyType;
                var predicateBitwiseOperation = searchPredicatePropertyInfo.PredicateBitwiseOperation;

                if (FilterPropertyValue is string _)
                {
                    var expression = StringContainsExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue is StringFilter stringFilter)
                {
                    var expression = StringFilterContainsExpr(stringFilter);


                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue is DateTimeFromToFilter dateTimeFromToFilter)
                {
                    var expression = DateTimeExpr(dateTimeFromToFilter, Item);

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue.GetType().IsGenericType&&
                         FilterPropertyValue.GetType().GetGenericTypeDefinition() == typeof(NumericFilter <>))
                {
                    var expression = NumericFilterExpr(Item);

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (!searchPredicatePropertyInfo.IsEntityTypeProperty)
                {
                    var expression = CollectionContainsExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }

                else
                {
                    var expression = DefaultExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
            }
        }
        private void PredicateBuilderByExpressions(
            IDictionary <PropertyInfo, SearchPredicatePropertyInfo> propertyInfoByPropName)
        {
            foreach (var(prop, searchPredicatePropertyInfo) in propertyInfoByPropName)
            {
                PropertyOrField     = searchPredicatePropertyInfo.PropertyOrField;
                EntityName          = searchPredicatePropertyInfo.EntityName;
                FilterPropertyValue = searchPredicatePropertyInfo.PropertyValue;
                FilterPropertyType  = prop.PropertyType;
                EntityPropertyType  = searchPredicatePropertyInfo.InstanceTypeOfProperty
                                      .GetProperty(EntityName.ToUpper(),
                                                   BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)?.PropertyType;
                var predicateBitwiseOperation = searchPredicatePropertyInfo.PredicateBitwiseOperation;

                if (FilterPropertyValue is string _)
                {
                    var expression = StringContainsExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue is StringFilter stringFilter)
                {
                    var expression = StringFilterContainsExpr(stringFilter);


                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue is DateTimeFromToFilterComplex dateTimeFromToFilterComplex)
                {
                    if (dateTimeFromToFilterComplex.DateFrom != null && !dateTimeFromToFilterComplex.DateFrom.DateTime.HasValue)
                    {
                        throw new ArgumentNullException(nameof(dateTimeFromToFilterComplex.DateFrom));
                    }

                    var expression = DateTimeExpr(dateTimeFromToFilterComplex, Item);

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue is DateTimeFromToFilter dateTimeFromToFilter)
                {
                    if (!dateTimeFromToFilter.DateFrom.HasValue)
                    {
                        throw new ArgumentNullException(nameof(dateTimeFromToFilter.DateFrom));
                    }

                    var expression = DateTimeExpr(dateTimeFromToFilter, Item);

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (FilterPropertyValue.GetType().IsGenericType&&
                         FilterPropertyValue.GetType().GetGenericTypeDefinition() == typeof(NumericFilter <>))
                {
                    var expression = NumericFilterExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
                else if (!searchPredicatePropertyInfo.IsEntityTypeProperty)
                {
                    var expression = CollectionContainsExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }

                else
                {
                    var expression = DefaultExpr();

                    AutoPredicate.PredicateByOperationType(predicateBitwiseOperation, expression);
                }
            }
        }