コード例 #1
0
ファイル: Order.cs プロジェクト: lipz89/XData
        /// <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);
        }
コード例 #2
0
ファイル: Query.cs プロジェクト: lipz89/XData
        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("不支持复杂的类型初始化。");
                }
            }
        }
コード例 #3
0
ファイル: Join.cs プロジェクト: lipz89/XData
 /// <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();
     }
 }
コード例 #4
0
ファイル: Query.cs プロジェクト: lipz89/XData
        /// <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);
        }
コード例 #5
0
 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);
 }
コード例 #6
0
        /// <summary>
        /// 转换成Sql语句
        /// </summary>
        /// <returns></returns>
        public override string ToSql()
        {
            var wb = SqlExpressionVistor.Visit(whereExpression, privoder);

            return(string.Format(" WHERE {0}", wb));
        }