/// <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> /// Expression嵌套解析 /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <param name="method">方法名,可选值:Join、Having、Where</param> public static int ExpressionNestedResolver(BinaryExpression expression, SqlWrapper sqlWrapper, string method) { //左侧嵌套 var lExpr = expression.Left as BinaryExpression; var llIsBinaryExpr = lExpr?.Left is BinaryExpression; var llIsBoolMethod = typeof(bool) == (lExpr?.Left as MethodCallExpression)?.Method.ReturnType; var lrIsBinaryExpr = lExpr?.Right is BinaryExpression; var lrIsBoolMethod = typeof(bool) == (lExpr?.Right as MethodCallExpression)?.Method.ReturnType; var lNested = (llIsBinaryExpr || llIsBoolMethod) && (lrIsBinaryExpr || lrIsBoolMethod); if (lNested) { sqlWrapper.Append("("); } if (method.EqualIgnoreCase(nameof(Join))) { SqlExpressionProvider.Join(expression.Left, sqlWrapper); } else if (method.EqualIgnoreCase(nameof(Having))) { SqlExpressionProvider.Having(expression.Left, sqlWrapper); } else { SqlExpressionProvider.Where(expression.Left, sqlWrapper); } if (lNested) { sqlWrapper.Append(")"); } var operatorIndex = sqlWrapper.Length; //右侧嵌套 var rExpr = expression.Right as BinaryExpression; var rlIsBinaryExpr = rExpr?.Left is BinaryExpression; var rlIsBoolMethod = typeof(bool) == (rExpr?.Left as MethodCallExpression)?.Method.ReturnType; var rrIsBinaryExpr = rExpr?.Right is BinaryExpression; var rrIsBoolMethod = typeof(bool) == (rExpr?.Right as MethodCallExpression)?.Method.ReturnType; var rNested = (rlIsBinaryExpr || rlIsBoolMethod) && (rrIsBinaryExpr || rrIsBoolMethod); if (rNested) { sqlWrapper.Append("("); } if (method.EqualIgnoreCase(nameof(Having))) { SqlExpressionProvider.Having(expression.Right, sqlWrapper); } else { SqlExpressionProvider.Where(expression.Right, sqlWrapper); } if (rNested) { sqlWrapper.Append(")"); } return(operatorIndex); }
/// <summary> /// Join /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Join(UnaryExpression expression, SqlWrapper sqlWrapper) { SqlExpressionProvider.Join(expression.Operand, sqlWrapper); return(sqlWrapper); }
/// <summary> /// Join /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <returns>SqlWrapper</returns> public override SqlWrapper Join(LambdaExpression expression, SqlWrapper sqlWrapper) { SqlExpressionProvider.Join(expression.Body, sqlWrapper); return(sqlWrapper); }