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