public string TranslateEntityQuery(EntityQueryExpression exp)
        {
            StringBuilder str = new StringBuilder();

            str.Append(this.TranslateSelect(exp));
            str.Append(SQL_FROM);
            str.Append(DbProvider.BuildTableName(exp.From.GetName()));
            if (exp.Joins != null)
            {
                foreach (var join in exp.Joins)
                {
                    str.Append(this.TranslateJoin(join));
                }
            }
            if (exp.Where != null)
            {
                str.Append(SQL_WHERE);
                str.Append(this.TranslateWhere(exp.Where));
            }
            if (exp.IsOrderBy)
            {
                str.Append(this.TranslateOrderyByList(exp.OrderByList));
            }
            if (exp.GroupBy != null)
            {
                str.Append(this.TranslateGroupBy(exp.GroupBy));
            }
            return(str.ToString());
        }
        public string TranslateSelect(EntityQueryExpression exp)
        {
            StringBuilder str = new StringBuilder();

            str.Append(SQL_SELECT);
            if (exp.IsDistinct != null && exp.IsDistinct.Value)
            {
                str.Append(SQL_DISTINCT);
            }
            //如果不是 子查询的表达式
            if (exp == this.Expression)
            {
                str.Append(this.DbProvider.GetSQLSelectTopClip(this));
            }
            var fields   = exp.SelectFields;
            var appended = false;

            foreach (var field in fields)
            {
                if (appended)
                {
                    str.Append(",");
                }
                str.Append(field.FullName);
                appended = true;
            }
            if (!appended)
            {
                str.Append(" *");
            }
            return(str.ToString());
        }
Esempio n. 3
0
        /// <summary>
        /// 跳过N行
        /// 实现方案: 根据排序和条件检索出全部数据
        /// 再加入一个条件:id 大于/或小于(需要根据排序来判断) 前N行记录ID的最大/最小值
        /// </summary>
        /// <param name="translater"></param>
        protected virtual void PrepareSkip(ExpressionTranslater translater)
        {
            var exp     = translater.Expression;
            var idField = exp.From.GetIdentityField();

            if ((idField as object) == null)
            {
                throw new NotImplementedException(TextResource.AutoKeyToSearchAllow);
            }
            var IsIdentityFieldDesc = exp.IsIdentityFieldDesc;
            //子查询
            var subTableName = "subtable";
            var subId        = idField.SetTableName(subTableName);
            var subTable     = DataHelper.Clone(exp.From) as Entity;

            subTable.SetAliasName(subTableName);
            var subExp = new EntityQueryExpression(subTable);

            //前N行记录ID的最大/最小值
            if (IsIdentityFieldDesc)
            {
                subExp.Select = new SelectExpression(new Field[] { subId.Min() });
            }
            else
            {
                subExp.Select = new SelectExpression(new Field[] { subId.Max() });
            }
            //复制条件与排序
            subExp.Where = exp.Where.Clone();
            subExp.Where.SetTable(subTableName);
            subExp.OrderByList = exp.OrderByList.Clone().SetTable(subTableName);
            //再加入一个条件:id 大于/或小于(需要根据排序来判断) 前N行记录ID的最大/最小值
            var newWhere = WhereExpression.Create(exp.From.GetIdentityField(), subExp,
                                                  IsIdentityFieldDesc ? QueryOperator.Less : QueryOperator.Greater);

            exp.Where = WhereExpression.Create(exp.Where, newWhere, QueryOperator.And);
        }
 public ExpressionTranslater(DbProvider dbProvider, EntityQueryExpression exp)
 {
     this.DbProvider = dbProvider;
     this.Params     = new List <QueryParameter>();
     this.Expression = exp;
 }