private Expression <Func <TEntity, bool> > DateTimeExpr(DateTimeFromToFilterComplex dateTimeFromToFilter,
                                                                ParameterExpression item)
        {
            Expression <Func <TEntity, bool> > lambdaExpr;


            if (EntityPropertyType.IsNullable())
            {
                var(fromDateExpressionInfo, toDateExpressionInfo) =
                    BuildExpressionDateTimeInfo(dateTimeFromToFilter, true);


                MemberExpression memberExpression = dateTimeFromToFilter.TruncateTime
                    ? Expression.Property(Expression.Property(PropertyOrField, "Value"), "Date")
                    : PropertyOrField;

                var ifTrue = memberExpression
                             .GreaterLessThanBuilderExpressions(fromDateExpressionInfo, toDateExpressionInfo,
                                                                BitwiseOperationExpressions.AndAlso);


                var nullOrGreaterLess = Expression.AndAlso(
                    Expression.Property(PropertyOrField, "HasValue"),
                    ifTrue);


                lambdaExpr = nullOrGreaterLess.LambdaExpressionBuilder <TEntity>(item);
            }
            else
            {
                var(dateFromExprInfo, dateToExprInfo) = BuildExpressionDateTimeInfo(dateTimeFromToFilter, false);

                var entityPropTruncated = dateTimeFromToFilter.TruncateTime
                    ? Expression.Property(PropertyOrField, "Date")
                    : PropertyOrField;

                var dateTimeExpr =
                    entityPropTruncated.GreaterLessThanBuilderExpressions(dateFromExprInfo, dateToExprInfo,
                                                                          BitwiseOperationExpressions.AndAlso);

                lambdaExpr = dateTimeExpr.LambdaExpressionBuilder <TEntity>(item);
            }

            return(lambdaExpr);
        }
        private Expression <Func <TEntity, bool> > DefaultExpr()
        {
            var right = Expression.Constant(FilterPropertyValue);
            BinaryExpression binaryExpression;

            if (EntityPropertyType.IsNullable())
            {
                var leftUnaryExpression = Expression.Convert(PropertyOrField, FilterPropertyValue.GetType());

                binaryExpression = Expression.Equal(leftUnaryExpression, right);
            }
            else
            {
                binaryExpression = Expression.Equal(PropertyOrField, right);
            }

            var lambda = binaryExpression.LambdaExpressionBuilder <TEntity>(Item);

            return(lambda);
        }
        private Expression <Func <TEntity, bool> > DateTimeExpr(DateTimeFromToFilter dateTimeFromToFilter,
                                                                ParameterExpression item)
        {
            var dateTimeValueDateFrom = dateTimeFromToFilter.DateFrom;
            //                        (DateTimeValue) propertiesDateTime[0].GetValue(propertyValue);
            var dateTimeValueDateTo = dateTimeFromToFilter.DateTo;
//            var bitwiseOperation = dateTimeFromToFilter.BitwiseOperation;


            var      fromDate = dateTimeValueDateFrom.DateTime;
            DateTime?toDate   = default;

            (ConstantExpression rightToDate, CompareExpressionType? ExpressionType)dateToInfoTuple = default;
            CompareExpressionType dateToExprType = default;

            if (dateTimeValueDateTo != null)
            {
                dateToExprType = dateTimeValueDateTo.ExpressionType ?? CompareExpressionType.LessThanOrEqual;
                toDate         = dateTimeValueDateTo.DateTime;
                if (toDate.HasValue)
                {
                    var rightToDate = Expression.Constant(toDate.Value.Date);
                    dateToInfoTuple = (rightToDate, dateToExprType);
                }
            }

            var rightFromDate = Expression.Constant(fromDate.Value.Date);

            var dateFromExprType =
                dateTimeValueDateFrom.ExpressionType ?? CompareExpressionType.GreaterThanOrEqual;
            var dateFromInfoTuple = (rightFromDate, compareExpressionType: dateFromExprType);
            Expression <Func <TEntity, bool> > lambdaExpr;

            if (EntityPropertyType.IsNullable())

            {
                var ifTrue = Expression.Property(Expression.Property(PropertyOrField, "Value"), "Date")
                             .GreaterLessThanBuilderExpressions(dateFromInfoTuple, dateToInfoTuple,
                                                                BitwiseOperationExpressions.AndAlso);

                var ifFalse = PropertyOrField.GreaterLessThanBuilderExpressions(
                    (Expression.Constant(fromDate, typeof(DateTime?)),
                     dateFromExprType),
                    toDate == null
                        ? default
                        : (Expression.Constant(toDate, typeof(DateTime?)),
                           dateToExprType), BitwiseOperationExpressions.AndAlso);


                var conditionalExpression =
                    Expression.Condition(Expression.Property(PropertyOrField, "HasValue"), ifTrue, ifFalse);

                lambdaExpr = conditionalExpression.LambdaExpressionBuilder <TEntity>(item);
            }
            else
            {
                var entityPropTruncated = Expression.Property(PropertyOrField, "Date");

                var dateTimeExpr =
                    entityPropTruncated.GreaterLessThanBuilderExpressions(dateFromInfoTuple, dateToInfoTuple,
                                                                          BitwiseOperationExpressions.AndAlso);

                lambdaExpr = dateTimeExpr.LambdaExpressionBuilder <TEntity>(item);
            }

            return(lambdaExpr);
        }