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