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()); }
/// <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; }