public override linq.Expression <Func <IEvaluationContext, bool> > GetExpression() { var paramX = linq.Expression.Parameter(typeof(IEvaluationContext), "x"); var castOp = linq.Expression.MakeUnary(linq.ExpressionType.Convert, paramX, typeof(PromotionEvaluationContext)); var methodInfo = typeof(PromotionEvaluationContext).GetMethod("IsItemInCategory"); var methodCall = linq.Expression.Call(castOp, methodInfo, linq.Expression.Constant(SelectedCategoryId), ExcludingCategoryIds.GetNewArrayExpression(), ExcludingProductIds.GetNewArrayExpression()); var retVal = linq.Expression.Lambda <Func <IEvaluationContext, bool> >(methodCall, paramX); return(retVal); }
public override linq.Expression <Func <IEvaluationContext, bool> > GetExpression() { var paramX = linq.Expression.Parameter(typeof(IEvaluationContext), "x"); var castOp = linq.Expression.MakeUnary(linq.ExpressionType.Convert, paramX, typeof(PromotionEvaluationContext)); var methodInfo = typeof(PromotionEvaluationContext).GetMethod("GetItemsOfCategoryQuantity"); var methodCall = linq.Expression.Call(castOp, methodInfo, linq.Expression.Constant(SelectedCategoryId), ExcludingCategoryIds.GetNewArrayExpression(), ExcludingProductIds.GetNewArrayExpression(), ExcludingSkuIds.GetNewArrayExpression()); var numItem = linq.Expression.Constant(NumItem); var binaryOp = ExactlyLeast.IsExactly ? linq.Expression.Equal(methodCall, numItem) : linq.Expression.GreaterThanOrEqual(methodCall, numItem); var retVal = linq.Expression.Lambda <Func <IEvaluationContext, bool> >(binaryOp, paramX); return(retVal); }
/// <summary> /// ((PromotionEvaluationContext)x).GetCartItemsOfCategoryQuantity(CategoryId, ExcludingCategoryIds, ExcludingProductIds) > NumItem /// </summary> /// <returns></returns> public override linq.Expression <Func <IEvaluationContext, bool> > GetConditionExpression() { var paramX = linq.Expression.Parameter(typeof(IEvaluationContext), "x"); var castOp = linq.Expression.MakeUnary(linq.ExpressionType.Convert, paramX, typeof(PromotionEvaluationContext)); var methodInfo = typeof(PromotionEvaluationContextExtension).GetMethod("GetCartItemsOfCategoryQuantity"); var leftOperandExpression = linq.Expression.Call(null, methodInfo, castOp, linq.Expression.Constant(CategoryId), ExcludingCategoryIds.GetNewArrayExpression(), ExcludingProductIds.GetNewArrayExpression()); var rightOperandExpression = linq.Expression.Constant(NumItem); var rightSecondOperandExpression = linq.Expression.Constant(NumItemSecond); var result = linq.Expression.Lambda <Func <IEvaluationContext, bool> >(GetConditionExpression(rightOperandExpression, rightOperandExpression, rightSecondOperandExpression), paramX); return(result); }
public override linq.Expression <Func <IEvaluationContext, bool> > GetExpression() { var paramX = linq.Expression.Parameter(typeof(IEvaluationContext), "x"); var castOp = linq.Expression.MakeUnary(linq.ExpressionType.Convert, paramX, typeof(PromotionEvaluationContext)); var lineItemTotal = linq.Expression.Constant(LineItemTotal); var methodInfo = typeof(PromotionEvaluationContext).GetMethod("IsAnyLineItemTotal"); var equalsOrAtLeast = ExactlyLeast.IsExactly ? linq.Expression.Constant(true) : linq.Expression.Constant(false); var methodCall = linq.Expression.Call(castOp, methodInfo, lineItemTotal, equalsOrAtLeast, ExcludingCategoryIds.GetNewArrayExpression(), ExcludingProductIds.GetNewArrayExpression(), ExcludingSkuIds.GetNewArrayExpression()); var retVal = linq.Expression.Lambda <Func <IEvaluationContext, bool> >(methodCall, paramX); return(retVal); }
/// <summary> /// ((PromotionEvaluationContext)x).IsItemInCategory(CategoryId, ExcludingCategoryIds, ExcludingProductIds) /// </summary> public override bool IsSatisfiedBy(IEvaluationContext context) { var result = false; if (context is PromotionEvaluationContext promotionEvaluationContext) { result = promotionEvaluationContext.IsItemInCategory(CategoryId, ExcludingCategoryIds.ToArray(), ExcludingProductIds.ToArray()); } return(result); }
/// <summary> /// ((PromotionEvaluationContext)x).GetCartItemsOfCategoryQuantity(CategoryId, ExcludingCategoryIds, ExcludingProductIds) > NumItem /// </summary> public override bool Evaluate(IEvaluationContext context) { var result = false; if (context is PromotionEvaluationContext promotionEvaluationContext) { var quantity = promotionEvaluationContext.GetCartItemsOfCategoryQuantity(CategoryId, ExcludingCategoryIds.ToArray(), ExcludingProductIds.ToArray()); result = UseCompareCondition(quantity, NumItem, NumItemSecond); } return(result); }