Example #1
0
        // 记录选中字段
        private void AddSelectedColumn(MemberInfo m, Type reflectedType)
        {
            string memberName          = m.Name;
            var    srcDbExpressionType = _builder.TranslateContext.CurrentExpressionType;
            var    srcIsOutermost      = _builder.TranslateContext.CurrentIsOutermost;

            if (!(srcDbExpressionType == DbExpressionType.Select && srcIsOutermost == true))
            {
                // 非外层字段,SELECT xx As name 的 name 使用数据库原生字段
                memberName = TypeUtils.GetFieldName(m, reflectedType);
            }
            // 选择字段
            string newName = _selectedColumns.Add(memberName);

            _builder.AppendAs(newName);
            _builder.Append(",");
            _builder.AppendNewLine();
        }
Example #2
0
        /// <summary>
        /// 访问字段或者属性表达式
        /// </summary>
        /// <param name="node">字段或者成员表达式</param>
        /// <returns></returns>
        protected override Expression VisitMember(MemberExpression node)
        {
            // 1.<>h__TransparentIdentifier3.b.Client.ClientName
            // 2.<>h__TransparentIdentifier3.b.Client.ClientName.Length
            // 3.<>h__TransparentIdentifier3.b.Client.Address.AddressName
            // 4.<>h__TransparentIdentifier3.b.ClientName
            // <>h__TransparentIdentifier2.<>h__TransparentIdentifier3.b.ClientName
            // <>h__TransparentIdentifier2.<>h__TransparentIdentifier3.b.Client.ClientName
            // <>h__TransparentIdentifier2.<>h__TransparentIdentifier3.b.Client.Address.AddressName
            // 5.b.ClientName


            if (node == null)
            {
                return(node);
            }
            // => a.ActiveDate == DateTime.Now  => a.State == (byte)state
            if (node.CanEvaluate())
            {
                return(this.VisitConstant(node.Evaluate()));
            }
            // => DateTime.Now
            if (node.Type == typeof(DateTime) && node.Expression == null)
            {
                return(this.VisitMethodCall(node, MethodCallType.MemberMember));
            }
            // => a.Nullable.Value
            bool isNullable = node.Expression.Type.IsGenericType && node.Member.Name == "Value" && node.Expression.Type.GetGenericTypeDefinition() == typeof(Nullable <>);

            if (isNullable)
            {
                this.Visit(node.Expression);
                return(node);
            }

            // 记录访问成员栈
            _visitedStack.Add(node);

            // => a.Name.Length
            if (TypeUtils.IsPrimitiveType(node.Expression.Type))
            {
                return(this.VisitMethodCall(node, MethodCallType.MemberMember));
            }
            // => <>h__3.b.ClientName
            if (!node.Expression.Visitable())
            {
                _builder.AppendMember(_ag, node);
                return(node);
            }
            // => a.Accounts[0].Markets[0].MarketId
            // => b.Client.Address.AddressName
            Expression objExpression = node.Expression;
            bool       isMethodCall  = objExpression != null && objExpression.NodeType == ExpressionType.Call;

            if (isMethodCall)
            {
                MethodCallExpression methodExpression = objExpression as MethodCallExpression;
                bool isIndex = methodExpression.IsCollectionIndex();
                if (isIndex)
                {
                    objExpression = methodExpression.Object;
                }
            }
            // => b.Client.Address.AddressName
            this.VisitNavMember(objExpression, TypeUtils.GetFieldName(node.Member, node.Expression.Type));

            return(node);
        }
Example #3
0
        /// <summary>
        /// 访问 Lambda 表达式,如 p=>p p=>p.t p=>p.Id
        /// </summary>
        /// <typeparam name="T">返回类型</typeparam>
        /// <param name="node">Lambda 表达式</param>
        /// <returns></returns>
        protected override Expression VisitLambda <T>(Expression <T> node)
        {
            LambdaExpression lambda = node as LambdaExpression;

            if (lambda.Body.NodeType == ExpressionType.Parameter)
            {
                // 例: a=> a
                Type   type  = lambda.Body.Type;
                string alias = _ag.GetTableAlias(lambda);
                this.VisitAllMember(type, alias);
                return(node);
            }
            else if (lambda.Body.CanEvaluate())
            {
                // 例:a=>1
                base.Visit(lambda.Body.Evaluate());
                // 选择字段
                string newName = _selectedColumns.Add(AppConst.CONSTANT_COLUMN_NAME);
                // 添加字段别名
                _builder.AppendAs(newName);
                return(node);
            }
            else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
            {
                // 例: t=> t.a
                // => SELECT a.ClientId
                Type type = lambda.Body.Type;
                if (!TypeUtils.IsPrimitiveType(type))
                {
                    return(this.VisitAllMember(type, _ag.GetTableAlias(lambda.Body), node));
                }
                else
                {
                    var newNode = this.VisitWithoutStack(_ => base.VisitLambda(node));

                    var    memberExpression = lambda.Body as MemberExpression;
                    string memberName       = memberExpression.Member.Name;

                    var srcDbExpressionType = _builder.TranslateContext.CurrentExpressionType;
                    var srcIsOutermost      = _builder.TranslateContext.CurrentIsOutermost;

                    if (!(srcDbExpressionType != null && srcDbExpressionType == DbExpressionType.Select && srcIsOutermost != null && srcIsOutermost.Value))
                    {
                        // 非外层字段,SELECT xx As name 的 name 使用数据库原生字段
                        memberName = TypeUtils.GetFieldName(memberExpression.Member, memberExpression.Expression.Type);
                    }

                    string newName = _selectedColumns.Add(memberName);
                    return(newNode);
                }
            }
            else
            {
                // 例:a => a.DemoCode,选择字段仅选一个基元类型字段。
                // 结果可能返回一个比如字符串类型列表
                var newNode = base.VisitLambda(node);
                if (_selectedColumns.Count == 0)
                {
                    // 选择字段
                    string newName = _selectedColumns.Add(AppConst.CONSTANT_COLUMN_NAME);
                    // 添加字段别名
                    _builder.AppendAs(newName);
                }
                return(newNode);
            }
        }