public void CreateWhereCompareExpressions(string memberName, object memberValue, CompareExpressionType compareExpressionType)
        {
            Expression       expression = null;
            MemberExpression member     = Expression.PropertyOrField(_parameterExpression, memberName);

            if (compareExpressionType == CompareExpressionType.Contains)
            {
                expression = Expression.Call(member, typeof(string).GetMethod("Contains"), Expression.Constant(memberValue));
            }
            else if (compareExpressionType == CompareExpressionType.Equal)
            {
                expression = Expression.Equal(member, Expression.Constant(memberValue, member.Type));
            }
            else if (compareExpressionType == CompareExpressionType.LessThan)
            {
                expression = Expression.LessThan(member, Expression.Constant(memberValue, member.Type));
            }
            else if (compareExpressionType == CompareExpressionType.LessThanOrEqual)
            {
                expression = Expression.LessThanOrEqual(member, Expression.Constant(memberValue, member.Type));
            }
            else if (compareExpressionType == CompareExpressionType.GreaterThan)
            {
                expression = Expression.GreaterThan(member, Expression.Constant(memberValue, member.Type));
            }
            else if (compareExpressionType == CompareExpressionType.GreaterThanOrEqual)
            {
                expression = Expression.GreaterThanOrEqual(member, Expression.Constant(memberValue, member.Type));
            }
            _expressions.Add(expression);
            //return expression;
            //
        }
        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);
        }
Beispiel #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);
        }