/// <summary> /// 转换成Sql语句 /// </summary> /// <returns></returns> public override string ToSql() { var orders = new Strings(); var columns = new List <string>(); foreach (var pair in sorts) { var exp = pair.Key; var sql = SqlExpressionVistor.Visit(exp, privoder); if (!columns.Contains(exp.ToString())) { var sc = pair.Value ? "ASC" : "DESC"; columns.Add(exp.ToString()); orders.Add(string.Format("{0} {1}", sql, sc)); } else { throw Error.Exception("排序依据列表中的依据不能重复:" + sql); } } if (columns.Any()) { return(" ORDER BY " + orders); } return(string.Empty); }
protected void GetMembers(Expression expression, Strings strs, MemberInfo member, string path = null) { if (expression is MemberExpression || expression is BinaryExpression) { var sql = SqlExpressionVistor.Visit(expression, this); var name = member.Name; if (!path.IsNullOrWhiteSpace()) { name = path + "-" + name; } var field = EscapeSqlIdentifier(name); strs.Add(string.Format("{0} AS {1}", sql, field)); namedType.Add(member, sql); return; } var newExp = expression as NewExpression; if (expression is MemberInitExpression) { var exp = (MemberInitExpression)expression; newExp = exp.NewExpression; foreach (var binding in exp.Bindings) { var me = binding as MemberAssignment; GetMembers(me.Expression, strs, binding.Member, path); } } var inits = newExp.Arguments; var mems = newExp.Members; for (int i = 0; i < mems?.Count; i++) { if (inits[i] is MemberExpression || inits[i] is BinaryExpression) { GetMembers(inits[i], strs, mems[i], path); } else if (inits[i] is NewExpression) { var _path = mems[i].Name; if (!path.IsNullOrWhiteSpace()) { _path = path + "-" + _path; } GetMembers(inits[i], strs, null, _path); } else { throw Error.NotSupportedException("不支持复杂的类型初始化。"); } } }
/// <summary> /// 获取子查询字段部分,每个字段都带着L-或R-前缀,表示字段路径 /// </summary> /// <returns></returns> protected override void SetInnerFields() { if (tableMeta.IsSimpleType()) { var sql = SqlExpressionVistor.Visit(this.selector, this); _fieldsPart = string.Format("{0} AS Field", sql); namedType.AddDefault(sql); } else { var strs = new Strings(); GetMembers(selector.Body, strs, null); _fieldsPart = strs.ToString(); } }
/// <summary> /// 聚合函数 /// </summary> /// <typeparam name="TAggregate"></typeparam> /// <param name="selector"></param> /// <param name="aggregateName"></param> /// <returns></returns> private TAggregate Aggregate <TAggregate>(Expression <Func <T, TAggregate> > selector, string aggregateName) { this.parameterIndex = 0; var _tableName = GetTableNameOrInnerSql(); var columnName = SqlExpressionVistor.Visit(selector, this); var sql = string.Format("SELECT {5}({4}{3}) FROM {0} {1} {2}", _tableName, this.GetWherePart(), this.GetOrderPart(), columnName, this.DistinctPart, aggregateName); var value = Context.ExecuteScalar(sql, this.DbParameters); if (value == DBNull.Value) { if (typeof(TAggregate).IsValueType && (aggregateName == "SUM" || aggregateName == "AVG")) { return(default(TAggregate)); } throw new XDataException("聚合结果为DBNull。"); } return((TAggregate)value); }
protected override object InitFieldsPart() { if (fieldsPart.IsNullOrWhiteSpace()) { if (tableMeta.IsSimpleType()) { var sql = SqlExpressionVistor.Visit(this.resultSelector, this); fieldsPart = string.Format("{0} AS Field", sql); namedType.AddDefault(sql); } else { var strs = new Strings(); GetMembers(resultSelector.Body, strs, null); fieldsPart = strs.ToString(); } } return(fieldsPart); }
/// <summary> /// 转换成Sql语句 /// </summary> /// <returns></returns> public override string ToSql() { var wb = SqlExpressionVistor.Visit(whereExpression, privoder); return(string.Format(" WHERE {0}", wb)); }