protected override Expression VisitBinary(BinaryExpression node) { WhereExpression.Append("("); Visit(node.Left); CurrentOperator = WhereOperator.GetOperator(node.NodeType); WhereExpression.AppendFormat(" {0} ", CurrentOperator); Visit(node.Right); WhereExpression.Append(")"); return(node); }
protected override Expression VisitUnary(UnaryExpression node) { if (node.NodeType == ExpressionType.Not) { WhereExpression.Append(WhereOperator.GetOperator(node.NodeType)); Visit(node.Operand); } else { Visit(node.Operand); } return(node); }
/// <summary> /// 构建表达式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expressionList"></param> /// <returns></returns> public string Build <T>(ref DynamicParameters param, List <WhereExpression> expressionList) { ClassType = typeof(T); Param = param; foreach (var item in expressionList) { if ((!item.Equals(expressionList.FindAll(f => string.IsNullOrEmpty(f.StringWhere)).First())) && item.ExpressType != ExpressionType.Default) { WhereExpression.AppendFormat(" {0} ", WhereOperator.GetOperator(item.ExpressType ?? 0)); } if (!string.IsNullOrEmpty(item.StringWhere)) { WhereExpression.Append(item.StringWhere); continue; } Visit(item.Expression); } return(WhereExpression.ToString()); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Arguments.Count == 3 && WhereOperator.Methods.Contains(node.Method.Name) && node.Method.Name.Contains("Between")) { WhereExpression.Append("("); CurrentOperator = WhereOperator.GetOperator(node.Method.Name); Visit(node.Arguments[0]); WhereExpression.AppendFormat(" {0} ", CurrentOperator); Visit(node.Arguments[1]); WhereExpression.AppendFormat(" AND "); Visit(node.Arguments[2]); WhereExpression.Append(")"); } else if (node.Arguments.Count == 2 && WhereOperator.Methods.Contains(node.Method.Name)) { WhereExpression.Append("("); Visit(node.Arguments[0]); CurrentOperator = WhereOperator.GetOperator(node.Method.Name); WhereExpression.AppendFormat(" {0} ", CurrentOperator); Visit(node.Arguments[1]); WhereExpression.Append(")"); } else if (node.Arguments.Count == 1 && WhereOperator.Methods.Contains(node.Method.Name)) { WhereExpression.Append("("); Visit(node.Arguments[0]); CurrentOperator = WhereOperator.GetOperator(node.Method.Name); WhereExpression.AppendFormat(" {0} ", CurrentOperator); WhereExpression.Append(")"); } else { var value = Expression.Lambda(node).Compile().DynamicInvoke(); SetValue(value); } return(node); }