/// <summary> /// Join /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Join(BinaryExpression expression, SqlWrapper sqlWrapper) { //左侧嵌套 var leftBinary = expression.Left as BinaryExpression; var isBinaryLeft = leftBinary?.Left is BinaryExpression; var isBoolMethodCallLeft = (leftBinary?.Left as MethodCallExpression)?.Method.ReturnType == typeof(bool); var isBinaryRight = leftBinary?.Right is BinaryExpression; var isBoolMethodCallRight = (leftBinary?.Right as MethodCallExpression)?.Method.ReturnType == typeof(bool); var leftNested = (isBinaryLeft || isBoolMethodCallLeft) && (isBinaryRight || isBoolMethodCallRight); if (leftNested) { sqlWrapper += "("; } SqlExpressionProvider.Join(expression.Left, sqlWrapper); if (leftNested) { sqlWrapper += ")"; } var operatorIndex = sqlWrapper.Length; //右侧嵌套 var rightBinary = expression.Right as BinaryExpression; isBinaryLeft = rightBinary?.Left is BinaryExpression; isBoolMethodCallLeft = (rightBinary?.Left as MethodCallExpression)?.Method.ReturnType == typeof(bool); isBinaryRight = rightBinary?.Right is BinaryExpression; isBoolMethodCallRight = (rightBinary?.Right as MethodCallExpression)?.Method.ReturnType == typeof(bool); var rightNested = (isBinaryLeft || isBoolMethodCallLeft) && (isBinaryRight || isBoolMethodCallRight); if (rightNested) { sqlWrapper += "("; } SqlExpressionProvider.Where(expression.Right, sqlWrapper); if (rightNested) { sqlWrapper += ")"; } //表达式左侧为bool类型常量且为true时,不进行sql拼接 if (!(expression.Left.NodeType == ExpressionType.Constant && expression.Left.ToObject() is bool b && b)) { var sqlLength = sqlWrapper.Length; OperatorResolver( expression.NodeType, operatorIndex, sqlWrapper, sqlLength - operatorIndex == 5 && sqlWrapper.EndsWith("NULL")); } return(sqlWrapper); }
/// <summary> /// Having /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Having(ConstantExpression expression, SqlWrapper sqlWrapper) { //表达式左侧为bool类型常量 if (expression.NodeType == ExpressionType.Constant && expression.Value is bool res) { if (!res && sqlWrapper.EndsWith("AND", "OR")) { sqlWrapper += " 1 = 0 "; } } else { sqlWrapper.AddDbParameter(expression.Value); } return(sqlWrapper); }
/// <summary> /// Equals /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> private static void Equals(MethodCallExpression expression, SqlWrapper sqlWrapper) { if (expression.Object != null) { SqlExpressionProvider.Where(expression.Object, sqlWrapper); } var signIndex = sqlWrapper.Length; SqlExpressionProvider.Where(expression.Arguments[0], sqlWrapper); if (sqlWrapper.EndsWith("NULL")) { sqlWrapper.Insert(signIndex, " IS "); } else { sqlWrapper.Insert(signIndex, " = "); } }
/// <summary> /// Where /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Where(ConditionalExpression expression, SqlWrapper sqlWrapper) { var isNot = false; var testExpression = expression.Test; //UnaryExpression if (testExpression is UnaryExpression unaryExpression) { isNot = unaryExpression.NodeType == ExpressionType.Not; testExpression = unaryExpression.Operand; } //MethodCallExpression if (testExpression is MethodCallExpression methodCallExpression) { var test = methodCallExpression.ToObject <bool>(out var res); if (res) { if (isNot ? !test : test) { SqlExpressionProvider.Where(expression.IfTrue, sqlWrapper); } else { SqlExpressionProvider.Where(expression.IfFalse, sqlWrapper); } } } //BinaryExpression if (testExpression is BinaryExpression binaryExpression) { var test = binaryExpression.ToObject <bool>(out var res); if (!res) { test = binaryExpression.Left.ToObject <bool>(out var left); if (!left) { SqlExpressionProvider.Where(binaryExpression.Left, sqlWrapper); BinaryExpressionResolver.OperatorResolver( binaryExpression.NodeType, sqlWrapper.Length, sqlWrapper, sqlWrapper.EndsWith("NULL")); } var right = false; if (!left) { test = binaryExpression.Right.ToObject <bool>(out right); } if (left || !right) { SqlExpressionProvider.Where(binaryExpression.Right, sqlWrapper); BinaryExpressionResolver.OperatorResolver( binaryExpression.NodeType, sqlWrapper.Length, sqlWrapper, sqlWrapper.EndsWith("NULL")); } } if (isNot ? !test : test) { SqlExpressionProvider.Where(expression.IfTrue, sqlWrapper); } else { SqlExpressionProvider.Where(expression.IfFalse, sqlWrapper); } } return(sqlWrapper); }