Ejemplo n.º 1
0
 private void Clear()
 {
     SqlBuilder.Clear();
     JoinRelations.Clear();
     WhereClause.Clear();
     Parameters.Clear();
     OrderByFields.Clear();
     GroupByFields.Clear();
     SelectFields.Clear();
 }
Ejemplo n.º 2
0
        public JoinQuery GroupBy <T1, T2, T3>(Expression <Func <T1, T2, T3, dynamic> > select = null)
        {
            DynamicVisitor visitor = new DynamicVisitor(WithAlias);

            visitor.Translate(select);
            foreach (DynamicMember c in visitor.DynamicMembers)
            {
                GroupByFields.AppendFormat("{0},", c.Field);
            }
            return(this);
        }
Ejemplo n.º 3
0
        public IndexDefinitionBase CreateAutoIndexDefinition()
        {
            if (IsMapReduce == false)
            {
                return(new AutoMapIndexDefinition(ForCollection, MapFields.Select(field =>
                                                                                  new IndexField
                {
                    Name = field.Name,
                    Storage = FieldStorage.No,
                    SortOption = SortDescriptors.FirstOrDefault(x => field.Name.Equals(x.Name))?.FieldType,
                    Highlighted = HighlightedFields.Any(x => field.Name.Equals(x))
                }).ToArray()));
            }

            if (MapFields.Length == 0)
            {
                throw new InvalidOperationException("Invalid dynamic map-reduce query mapping. There is no aggregation specified.");
            }

            if (GroupByFields.Length == 0)
            {
                throw new InvalidOperationException("Invalid dynamic map-reduce query mapping. There is no group by field specified.");
            }

            return(new AutoMapReduceIndexDefinition(new[] { ForCollection }, MapFields.Select(field =>
                                                                                              new IndexField
            {
                Name = field.Name,
                Storage = FieldStorage.Yes,
                MapReduceOperation = field.MapReduceOperation,
                SortOption = SortDescriptors.FirstOrDefault(x => field.Name.Equals(x.Name))?.FieldType,
            }).ToArray(),
                                                    GroupByFields.Select(field =>
                                                                         new IndexField
            {
                Name = field,
                Storage = FieldStorage.Yes,
                SortOption = SortDescriptors.FirstOrDefault(x => field.Equals(x.Name))?.FieldType,
            }).ToArray()));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 多表连查分页
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <param name="page"></param>
        /// <returns></returns>
        public PageDataSource <TModel> GetPage <TModel>(PageFilter page)
        {
            List <JoinRelation> tables = new List <JoinRelation>();

            SqlBuilder.AppendFormat(" SELECT {0} FROM {1}", SelectFields.ToString().TrimEnd(','), JoinRelations[0].LeftTable);
            if (WithAlias)
            {
                SqlBuilder.AppendFormat(" AS {0}", JoinRelations[0].LeftTableAlias);
            }
            foreach (JoinRelation j in JoinRelations)
            {
                if (j.JoinType == JoinType.Outer)
                {
                    SqlBuilder.Append(" LEFT OUTER JOIN ");
                }
                else
                {
                    SqlBuilder.Append(" INNER JOIN ");
                }
                if (WithAlias)
                {
                    if (tables.Count(m => m.LeftTableAlias == j.RightTableAlias || m.RightTableAlias == j.RightTableAlias) == 0)
                    {
                        SqlBuilder.AppendFormat("{0} AS {1}", j.RightTable, j.RightTableAlias);
                        tables.Add(j);
                    }
                    else
                    {
                        SqlBuilder.AppendFormat("{0} AS {1}", j.LeftTable, j.LeftTableAlias);
                        tables.Add(j);
                    }
                }
                else
                {
                    if (tables.Count(m => m.LeftTable == j.RightTable || m.RightTable == j.RightTable) == 0)
                    {
                        SqlBuilder.Append(j.RightTable);
                        tables.Add(j);
                    }
                    else
                    {
                        SqlBuilder.Append(j.LeftTable);
                        tables.Add(j);
                    }
                }
                SqlBuilder.AppendFormat(" ON {0}", j.OnSql.TrimEnd("AND".ToCharArray()));
            }
            if (WhereClause.Length > 0)
            {
                SqlBuilder.AppendFormat(" WHERE {0}", WhereClause.ToString().Trim().TrimEnd("AND".ToCharArray()));
            }
            if (GroupByFields.Length > 0)
            {
                SqlBuilder.AppendFormat(" GROUP BY {0}", GroupByFields.ToString().Trim().TrimEnd(','));
            }
            if (OrderByFields.Length > 0)
            {
                page.OrderText = OrderByFields.ToString().Trim().TrimEnd(',');
            }
            //开始组装sql
            //开始组装sql
            PageDataSource <TModel> result = DbContext.GetPage <TModel>(SqlBuilder.ToString(), page, Parameters.ToArray());

            if (this.IsAutoDisposeDbContext)
            {
                DbContext.Dispose();
            }
            return(result);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 返回数量
        /// </summary>
        /// <returns></returns>
        public int GetCount()
        {
            List <JoinRelation> tables = new List <JoinRelation>();

            SqlBuilder.AppendFormat(" SELECT COUNT(1) AS CT FROM {0}", JoinRelations[0].LeftTable);
            if (WithAlias)
            {
                SqlBuilder.AppendFormat(" AS {0}", JoinRelations[0].LeftTableAlias);
            }
            foreach (JoinRelation j in JoinRelations)
            {
                if (j.JoinType == JoinType.Outer)
                {
                    SqlBuilder.Append(" LEFT OUTER JOIN ");
                }
                else
                {
                    SqlBuilder.Append(" INNER JOIN ");
                }
                if (WithAlias)
                {
                    if (tables.Count(m => m.LeftTableAlias == j.RightTableAlias || m.RightTableAlias == j.RightTableAlias) == 0)
                    {
                        SqlBuilder.AppendFormat("{0} AS {1}", j.RightTable, j.RightTableAlias);
                        tables.Add(j);
                    }
                    else
                    {
                        SqlBuilder.AppendFormat("{0} AS {1}", j.LeftTable, j.LeftTableAlias);
                        tables.Add(j);
                    }
                }
                else
                {
                    if (tables.Count(m => m.LeftTable == j.RightTable || m.RightTable == j.RightTable) == 0)
                    {
                        SqlBuilder.Append(j.RightTable);
                        tables.Add(j);
                    }
                    else
                    {
                        SqlBuilder.Append(j.LeftTable);
                        tables.Add(j);
                    }
                }
                SqlBuilder.AppendFormat(" ON {0}", j.OnSql.TrimEnd("AND".ToCharArray()));
            }
            if (WhereClause.Length > 0)
            {
                SqlBuilder.AppendFormat(" WHERE {0}", WhereClause.ToString().Trim().TrimEnd("AND".ToCharArray()));
            }
            if (GroupByFields.Length > 0)
            {
                SqlBuilder.AppendFormat(" GROUP BY {0}", GroupByFields.ToString().Trim().TrimEnd(','));
            }
            if (OrderByFields.Length > 0)
            {
                SqlBuilder.AppendFormat(" ORDER BY {0}", OrderByFields.ToString().Trim().TrimEnd(','));
            }
            //开始组装sql
            int result = DbContext.GetSingle <int>(SqlBuilder.ToString(), Parameters.ToArray());

            if (this.IsAutoDisposeDbContext)
            {
                DbContext.Dispose();
            }
            return(result);
        }