private IJoinQuery <TResult> Join <TR, TKey, TResult>(string type, IQuery <TR> rightQuery, Expression <Func <T, TKey> > leftKeySelector, Expression <Func <TR, TKey> > rightKeySelector, Expression <Func <T, TR, TResult> > resultSelector) where TR : BaseDBModel, new() { var dynamicParameters = new DynamicParameters(); var left = new JoinExpression(leftKeySelector, new Dictionary <string, string> { { "", "t1" } }, dynamicParameters, DBModel.GetDBModel_SqlProvider()); var right = new JoinExpression(rightKeySelector, new Dictionary <string, string> { { "", "t2" } }, dynamicParameters, DBModel.GetDBModel_SqlProvider()); StringBuilder sqlJoin = new StringBuilder(); foreach (var v in left.JoinDic) { if (sqlJoin.Length > 0) { sqlJoin.Append(" AND "); } sqlJoin.Append("("); sqlJoin.Append(v.Value); sqlJoin.Append("="); sqlJoin.Append(right.JoinDic[v.Key]); sqlJoin.Append(")"); } var joinStr = $"{DBTool.GetTableName(DBModel)} t1 {DBTool.GetTableWith(this)} {type} JOIN {DBTool.GetTableName(rightQuery.DBModel)} t2 {DBTool.GetTableWith(rightQuery)} ON {sqlJoin}"; var sel = new JoinResultMapExpression(resultSelector, new Dictionary <string, string> { { "", "t1" } }, "t2", dynamicParameters, DBModel.GetDBModel_SqlProvider()); StringBuilder sqlWhere = new StringBuilder(); var where = new WhereExpression(this.WhereExpression, "t1", dynamicParameters, DBModel.GetDBModel_SqlProvider()); if (!string.IsNullOrEmpty(where.SqlCmd)) { sqlWhere.Append(where.SqlCmd); } where = new WhereExpression(rightQuery.WhereExpression, "t2", dynamicParameters, DBModel.GetDBModel_SqlProvider()); if (!string.IsNullOrEmpty(where.SqlCmd)) { sqlWhere.Append(where.SqlCmd); } return(new JoinQueryInfo <TResult>(DBModel, joinStr, 2, sel.MapList, sqlWhere.ToString(), dynamicParameters)); }
private IJoinQuery <TResult> Join <TR, TKey, TResult>(string type, IQuery <TR> rightQuery, Expression <Func <T, TKey> > leftKeySelector, Expression <Func <TR, TKey> > rightKeySelector, Expression <Func <T, TR, TResult> > resultSelector) where TR : BaseDBModel, new() { var rightTableAlias = "t" + (JoinTableCount + 1); var dynamicParameters = new DynamicParameters(); dynamicParameters.AddDynamicParams(Param); var left = new JoinExpression(leftKeySelector, Map, dynamicParameters); var right = new JoinExpression(rightKeySelector, new Dictionary <string, string> { { "", rightTableAlias } }, dynamicParameters); StringBuilder sqlJoin = new StringBuilder(); foreach (var v in left.JoinDic) { if (sqlJoin.Length > 0) { sqlJoin.Append(" AND "); } sqlJoin.Append("("); sqlJoin.Append(v.Value); sqlJoin.Append("="); sqlJoin.Append(right.JoinDic[v.Key]); sqlJoin.Append(")"); } var joinStr = $"{JoinStr} {type} JOIN {DBTool.GetTableName(rightQuery.DBModel)} {rightTableAlias} ON {sqlJoin}"; var sel = new JoinResultMapExpression(resultSelector, Map, rightTableAlias, dynamicParameters); StringBuilder sqlWhere = new StringBuilder(Where); var where = new WhereExpression(rightQuery.WhereExpression, rightTableAlias, dynamicParameters); if (!string.IsNullOrEmpty(where.SqlCmd)) { if (sqlWhere.Length > 0) { sqlWhere.Append(" AND "); } sqlWhere.Append(where.SqlCmd); } return(new JoinQueryInfo <TResult>(joinStr, JoinTableCount + 1, sel.MapList, sqlWhere.ToString(), dynamicParameters)); }