private Expression <Func <TEntity, bool> > DateTimeExpr(DateTimeFromToFilter 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> > 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);
        }
Exemple #3
0
        internal static (ExpressionDateTimeInfo dateFromExprInfo, ExpressionDateTimeInfo dateToExprInfo) BuildExpressionDateTimeInfo(DateTimeFromToFilter dateTimeFromToFilter, bool nullable)
        {
            // var dateTimeValueDateFrom = dateTimeFromToFilter.DateFrom;
            // var dateTimeValueDateTo = dateTimeFromToFilter.DateTo;
            var fromDate = dateTimeFromToFilter.DateFrom;
            var toDate   = dateTimeFromToFilter.DateTo;
            const CompareExpressionType fromDateExprType = CompareExpressionType.GreaterThanOrEqual;
            CompareExpressionType       toDateExprType   = default;


            if (toDate != null)
            {
                toDateExprType = CompareExpressionType.LessThanOrEqual;
                toDate         = dateTimeFromToFilter.DateTo;
            }


            ExpressionDateTimeInfo dateToExprInfo = default;
            ConstantExpression     fromDateExpressionConstant;

            if (dateTimeFromToFilter.TruncateTime)
            {
                fromDateExpressionConstant = Expression.Constant(fromDate.Value.Date, typeof(DateTime));
            }
            else
            {
                fromDateExpressionConstant = nullable
                    ? Expression.Constant(fromDate, typeof(DateTime?))
                                                 : Expression.Constant((DateTime)fromDate, typeof(DateTime));
            }

            if (toDate.HasValue)
            {
                ConstantExpression toDateExpressionConstant;
                if (dateTimeFromToFilter.TruncateTime)
                {
                    toDateExpressionConstant = Expression.Constant(toDate.Value.Date, typeof(DateTime));
                }
                else
                {
                    toDateExpressionConstant = nullable
                        ? Expression.Constant(toDate, typeof(DateTime?))
                                                   : Expression.Constant((DateTime)toDate, typeof(DateTime));
                }

                dateToExprInfo = new ExpressionDateTimeInfo {
                    Constant = toDateExpressionConstant, ExpressionType = toDateExprType, DateTime = toDate
                };

                //                        (rightToDate, dateToExprType);
            }

            else
            {
                dateToExprInfo = new ExpressionDateTimeInfo();
            }

            var dateFromExprInfo = new ExpressionDateTimeInfo {
                Constant = fromDateExpressionConstant, ExpressionType = fromDateExprType, DateTime = fromDate
            };

            return(dateFromExprInfo, dateToExprInfo);
        }