SchemaModel.Table GetTable()
        {
            while (true)
            {
                var memExp = (MemberExpression)_memberInfos.Peek();
                _tableMember = memExp.Member;
                Type type = null;
                if (_tableMember.MemberType == MemberTypes.Field)
                {
                    type = ((FieldInfo)_tableMember).FieldType;
                }
                else
                {
                    type = ((PropertyInfo)_tableMember).PropertyType;
                }
                if (TypeHelper.IsCompilerGenerated(type))
                {
                    _memberInfos.Pop();
                    continue;
                }
                if (TableInfoManager.IsEntity(type))
                {
                    _memberInfos.Pop();
                    return(GetTable(type));
                }
                return(null);
            }
            _tableMember = ((MemberExpression)_memberInfos.Pop()).Member;
            var tableType = ((PropertyInfo)_tableMember).PropertyType;

            return(GetTable(tableType));
        }
Example #2
0
        protected override Expression VisitParameter(ParameterExpression node)
        {
            var type = node.Type;

            while (!TableInfoManager.IsEntity(type))
            {
                var exp = _memberExpressions.Pop();
                type = exp.Type;
            }
            ParseEntityType(type);
            return(node);
        }
        protected override Expression VisitParameter(ParameterExpression node)
        {
            var column = new Column();

            if (TableInfoManager.IsEntity(node.Type))
            {
                //弹出第一个参数,一般是列
                var table       = GetTable(node.Type);
                var _memberInfo = ((MemberExpression)_memberInfos.Pop()).Member;
                column.DataType   = ((PropertyInfo)_memberInfo).PropertyType;
                column.Name       = table.Columns.Get(_memberInfo.Name).Name;
                column.MemberInfo = _memberInfo;
                var tableAlias = node.Name;
                if (_joins != null)
                {
                    if (_joins.ContainsKey(tableAlias))
                    {
                        tableAlias = _joins[tableAlias].Right.Table.Alias;
                    }
                }
                else
                {
                    tableAlias = table.Name;
                }
                column.Table = CreateTable(tableAlias, table.DataBase, table.Name, table.Type);
                while (_memberInfos.Count > 0)
                {
                    var exp = _memberInfos.Pop();
                    switch (exp.NodeType)
                    {
                    case ExpressionType.MemberAccess:
                        var memberInfo = ((MemberExpression)exp).Member;
                        column.Converters.Push(new ColumnConverter(memberInfo, new List <object>()));
                        break;

                    default:
                        throw new Exception();
                    }
                }
                //column.Converter = GetConverter(null);
            }
            else
            {
                SchemaModel.Table tableInfo    = GetTable();
                MemberInfo        columnMember = null;
                var   tableAlias = string.Empty;
                Table table      = null;
                if (tableInfo != null)
                {
                    tableAlias   = _tableMember.Name;
                    columnMember = ((MemberExpression)_memberInfos.Pop()).Member;
                    if (_joins != null)
                    {
                        if (_joins.ContainsKey(tableAlias))
                        {
                            tableAlias = _joins[tableAlias].Right.Table.Alias;
                        }
                    }
                    else
                    {
                        tableAlias = tableInfo.Name;
                    }
                    table = CreateTable(tableAlias, tableInfo.DataBase, tableInfo.Name, tableInfo.Type);
                }
                else
                {
                    columnMember = ((MemberExpression)_memberInfos.Pop()).Member;
                    table        = _columns.Get(columnMember.Name).Table;
                    tableAlias   = table.Alias;
                    tableInfo    = GetTable(table.Type);
                }
                //if (_memberInfos.Count > 1)
                //{
                //    tableInfo = GetTable();
                //}
                //else
                //{
                //}
                var columnType   = ((PropertyInfo)columnMember).PropertyType;
                var columnName   = string.Empty;
                var columnSechma = tableInfo.Columns.Get(columnMember.Name);
                if (columnSechma != null)
                {
                    columnName = columnSechma.Name;
                }
                else
                {
                    columnName = Context.Columns.Get(columnMember.Name).Name;
                }
                column = new Column()
                {
                    DataType   = columnType,
                    Name       = columnName,
                    Table      = table,
                    MemberInfo = columnMember
                };
                while (_memberInfos.Count > 0)
                {
                    var exp = _memberInfos.Pop();
                    switch (exp.NodeType)
                    {
                    case ExpressionType.MemberAccess:
                        var memberInfo = ((MemberExpression)exp).Member;
                        column.Converters.Push(new ColumnConverter(memberInfo, new List <object>()));
                        break;

                    default:
                        throw new Exception();
                    }
                }
                //column.Converter = GetConverter(null);
            }
            Token = Token.Create(column);
            return(node);
        }
Example #4
0
 protected override Expression VisitParameter(ParameterExpression node)
 {
     //MemberExpressionType = MemberExpressionType.Column;
     if (TableInfoManager.IsEntity(node.Type))
     {
         //弹出第一个参数,一般是列
         var table       = GetTable(node.Type);
         var _memberInfo = _memberInfoStack.Pop();
         SelectedColumn.DataType   = ((PropertyInfo)_memberInfo).PropertyType;
         SelectedColumn.Name       = table.Columns.Get(_memberInfo.Name).Name;
         SelectedColumn.MemberInfo = _memberInfo;
         var tableAlias = node.Name;
         if (_Joins != null)
         {
             if (_Joins.ContainsKey(tableAlias))
             {
                 tableAlias = _Joins[tableAlias].Right.Table.Alias;
             }
         }
         else
         {
             tableAlias = table.Name;
         }
         SelectedColumn.Table = CreateTable(tableAlias, table.DataBase, table.Name, table.Type);
         while (_memberInfoStack.Count > 0)
         {
             var propertyInfo = (MemberInfo)_memberInfoStack.Pop();
             SelectedColumn.Converters.Push(new ColumnConverter(propertyInfo, new List <object>()));
         }
         //SelectedColumn.Converter = GetConverter();
     }
     else
     {
         var tableInfo    = GetTable();
         var columnMember = _memberInfoStack.Pop();
         var columnType   = ((PropertyInfo)columnMember).PropertyType;
         var tableAlias   = _tableMember.Name;
         if (_Joins != null)
         {
             if (_Joins.ContainsKey(tableAlias))
             {
                 tableAlias = _Joins[tableAlias].Right.Table.Alias;
             }
         }
         else
         {
             tableAlias = tableInfo.Name;
         }
         var table = CreateTable(tableAlias, tableInfo.DataBase, tableInfo.Name, tableInfo.Type);
         SelectedColumn = new Column()
         {
             DataType   = columnType,
             Name       = tableInfo.Columns.Get(columnMember.Name).Name,
             Table      = table,
             MemberInfo = columnMember
         };
         while (_memberInfoStack.Count > 0)
         {
             var exp = _memberInfoStack.Pop();
             SelectedColumn.Converters.Push(new ColumnConverter(exp, new List <object>()));
         }
         //SelectedColumn.Converter = GetConverter();
     }
     return(node);
 }