Esempio n. 1
0
        internal protected virtual SelectClauseCollection GenerateSelectClauseCollection(Query query, out IReadOnlyDictionary <string, object> dbParameterValues)
        {
            IReadOnlyDictionary <string, object> constants    = new Dictionary <string, object>();
            IReadOnlyDictionary <string, string> paramMapping = new Dictionary <string, string>();

            Table table = new Table(query.Properties, query.Entity, query.Schema);

            SelectClauseCollection clauses = new SelectClauseCollection()
            {
                Select = GenerateSelect(query.Select, table),
                From   = "FROM " + DecorateTableName(table.Name)
            };

            clauses.From += " " + DecorateTableAlias(table.TableAlias);

            clauses.LeftJoins = GenerateLeftJoins(table.ForeignKeyTrees);
            if (query.Filter != null)
            {
                clauses.Where = GenerateWhere(query, table, out constants, out paramMapping);
            }
            if (query.Orderby != null)
            {
                clauses.OrderBy = GenerateOrderBy(query.Orderby, table);
            }

            dbParameterValues = GetDbParameterValues(constants, paramMapping, query.Parameters.ParameterValues);
            return(clauses);
        }
        protected SelectClauseCollection GenerateSelectClauseCollection(Query query, out DbParameter[] dbParameters)
        {
            SelectClauseCollection clauses = GenerateSelectClauseCollection(query, out IReadOnlyDictionary <string, object> dbParameterValues);

            dbParameters = CreateParameters(dbParameterValues);
            return(clauses);
        }
Esempio n. 3
0
        protected override void SetRootSelectStatments(TempTableNode root, QueryExpand queryExpand)
        {
            Query query = queryExpand.Query;

            root.TempTableName = GetTempTableName();
            SelectClauseCollection clauses = GenerateSelectClauseCollection(query, out DbParameter[] dbParameters);
            List <string>          list    = new List <string>
            {
                string.Format("CREATE GLOBAL TEMPORARY TABLE {0} ON COMMIT PRESERVE ROWS AS", root.TempTableName),
                clauses.Select,
                clauses.From,
                string.Join(" ", clauses.LeftJoins),
                clauses.Where ?? string.Empty,
                clauses.OrderBy ?? string.Empty
            };

            string sql = string.Join(" ", list);

            root.BeforeExecuteStatments.Add(new SQLStatment(sql, dbParameters));

            //
            string fetchSql = string.Format("SELECT * FROM {0}", root.TempTableName);

            root.FetchTableStatment = new SQLStatment(fetchSql);
        }
        protected override void SetRootSelectStatments(TempTableNode root, QueryExpand queryExpand)
        {
            Query query = queryExpand.Query;

            root.TempTableName = GetTempTableName();
            SelectClauseCollection clauses = GenerateSelectClauseCollection(query, out DbParameter[] dbParameters);
            List <string>          list    = new List <string>
            {
                clauses.Select,
                "INTO " + root.TempTableName,
                clauses.From,
                string.Join(" ", clauses.LeftJoins),
                clauses.Where ?? string.Empty,
                //clauses.OrderBy ?? string.Empty
            };

            string sql = string.Join(" ", list);

            root.BeforeExecuteStatments.Add(new SQLStatment(sql, dbParameters));

            //
            string fetchSql = string.Format("SELECT * FROM {0}", root.TempTableName);

            if (query.Orderby != null)
            {
                IEnumerable <string> orderby = query.Orderby.Orders.Select(order => order.Property + ((order is DescendingOrder) ? " DESC" : " ASC"));
                fetchSql += " ORDER BY " + string.Join(",", orderby);
            }
            root.FetchTableStatment = new SQLStatment(fetchSql);
        }
        //SELECT [T].[Id], [T].[RoleName], [S1].[EmployeeId] [EmployeeId], ROW_NUMBER() OVER(ORDER BY [S1].[EmployeeId], [T].Id) [RowNumber]
        //INTO [#V2]
        //FROM [Roles] [T]
        //INNER JOIN [UsersRoles] [S] ON [T].[Id] = [S].[RoleId]
        //INNER JOIN [Users] [S1] ON [S1].[Id] = [S].[UserId]
        //INNER JOIN [#V1] S2 ON S2.Id = [S1].[EmployeeId]
        //LEFT JOIN...
        //WHERE ...
        private string GeneratePrimarySql(TempTableNode node, Relationship relationship, Query query, out DbParameter[] dbParameters,
                                          out string tempTableName1, out string rowNumberAlias)
        {
            ForeignKey[]         foreignKeys = CreateUndirectedForeignKeys(relationship, query.Schema);
            IEnumerable <string> innerJoins  = GenerateInnerJoins(foreignKeys, node.ParentTempTableName);

            IEnumerable <string> relatedKeyColProps = GetRelatedKeyColProps(node, foreignKeys[0], out IEnumerable <string> relatedKeyCols);
            IEnumerable <string> overOrderByCols    = GetOverOrderByCols(relatedKeyCols, query);

            rowNumberAlias = GetRowNumberAlias(query.Select, node.RelatedKey);

            //ROW_NUMBER() OVER(ORDER BY [S1].[EmployeeId], [T].[Id]) [RowNumber]
            string rowNumberSelect = string.Format("ROW_NUMBER() OVER(ORDER BY {0}) {1}", string.Join(", ", overOrderByCols), rowNumberAlias);

            tempTableName1 = GetTempTableName();
            SelectClauseCollection clauses = GenerateSelectClauseCollection(query, out dbParameters);
            List <string>          list    = new List <string>
            {
                string.Join(", ", clauses.Select, string.Join(", ", relatedKeyColProps), rowNumberSelect),
                string.Format("INTO {0}", tempTableName1),
                clauses.From,
                string.Join(" ", innerJoins),
                string.Join(" ", clauses.LeftJoins),
                clauses.Where ?? string.Empty,
            };

            return(string.Join(" ", list));
        }
Esempio n. 6
0
        public virtual string GenerateCountStatement(Query query, out IReadOnlyDictionary <string, object> dbParameterValues)
        {
            SelectClauseCollection clauses = GenerateCountClauseCollection(query, out dbParameterValues);

            List <string> list = new List <string>
            {
                clauses.Select,
                clauses.From,
                string.Join(" ", clauses.LeftJoins),
                clauses.Where ?? string.Empty
            };

            return(string.Join(" ", list));
        }
Esempio n. 7
0
        protected override PagingClauseCollection GeneratePagingClauseCollection(Query query, out IReadOnlyDictionary <string, object> dbParameterValues)
        {
            long top = (query.Top == 0) ? long.MaxValue : query.Top;

            SelectClauseCollection selectClauses = GenerateSelectClauseCollection(query, out dbParameterValues);
            PagingClauseCollection PagingClauses = new PagingClauseCollection(selectClauses)
            {
                Clauses = new string[1]
            };

            PagingClauses.Clauses[0] = string.Format("LIMIT {0},{1}", query.Skip, top);

            return(PagingClauses);
        }
Esempio n. 8
0
        internal protected override PagingClauseCollection GeneratePagingClauseCollection(Query query, out IReadOnlyDictionary <string, object> dbParameterValues)
        {
            SelectClauseCollection selectClauses = GenerateSelectClauseCollection(query, out dbParameterValues);
            PagingClauseCollection pagingClauses = new PagingClauseCollection(selectClauses);

            List <string> clauses = new List <string>
            {
                string.Format("OFFSET {0} ROWS", query.Skip)
            };

            if (query.Top != 0)
            {
                clauses.Add(string.Format("FETCH NEXT {0} ROWS ONLY", query.Top));
            }
            pagingClauses.Clauses = clauses.ToArray();

            return(pagingClauses);
        }
        //Create TEMPORARY TABLE temp2
        //SELECT T.Id, T.RoleName, S1.EmployeeId EmployeeId
        //FROM Roles T
        //INNER JOIN UsersRoles S ON T.Id = S.RoleId
        //INNER JOIN Users S1 ON S1.Id = S.UserId
        //INNER JOIN #V1 S2 ON S2.Id = S1.EmployeeId
        //LEFT JOIN...
        //WHERE ...
        private string GeneratePrimarySql(TempTableNode node, Relationship relationship, Query query, out DbParameter[] dbParameters,
                                          out string tempTableName1)
        {
            ForeignKey[]         foreignKeys = CreateUndirectedForeignKeys(relationship, query.Schema);
            IEnumerable <string> innerJoins  = GenerateInnerJoins(foreignKeys, node.ParentTempTableName);

            IEnumerable <string> relatedKeyColProps = GetRelatedKeyColProps(node, foreignKeys[0], out IEnumerable <string> relatedKeyCols);

            tempTableName1 = GetTempTableName();
            SelectClauseCollection clauses = GenerateSelectClauseCollection(query, out dbParameters);
            List <string>          list    = new List <string>
            {
                string.Format("Create TEMPORARY TABLE {0}", tempTableName1),
                string.Join(", ", clauses.Select, string.Join(", ", relatedKeyColProps)),
                clauses.From,
                string.Join(" ", innerJoins),
                string.Join(" ", clauses.LeftJoins),
                clauses.Where ?? string.Empty
            };

            return(string.Join(" ", list));
        }