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);
        }
예제 #2
0
        internal static (ExpressionDateTimeInfo dateFromExprInfo, ExpressionDateTimeInfo dateToExprInfo) BuildExpressionDateTimeInfo(DateTimeFromToFilterComplex dateTimeFromToFilter, bool nullable)
        {
            var      dateTimeValueDateFrom = dateTimeFromToFilter.DateFrom;
            var      dateTimeValueDateTo   = dateTimeFromToFilter.DateTo;
            var      fromDate         = dateTimeValueDateFrom.DateTime;
            DateTime?toDate           = default;
            var      fromDateExprType =
                dateTimeValueDateFrom.ExpressionType ?? CompareExpressionType.GreaterThanOrEqual;
            CompareExpressionType toDateExprType = default;


            if (dateTimeValueDateTo != null)
            {
                toDateExprType = dateTimeValueDateTo.ExpressionType ?? CompareExpressionType.LessThanOrEqual;
                toDate         = dateTimeValueDateTo.DateTime;
            }


            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);
        }