示例#1
0
        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));
        }
示例#2
0
        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));
        }