コード例 #1
0
        protected override System.Linq.Expressions.Expression VisitConstant(System.Linq.Expressions.ConstantExpression node)
        {
            var table = TableInfoManager.GetTable(node.Type.GetGenericArguments()[0]);

            ExtraObject = table.Name;
            return(base.VisitConstant(node));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
 SchemaModel.Table GetTable(Type tableType)
 {
     if (ParserUtils.IsAnonymousType(tableType))
     {
         _tableMember = ((MemberExpression)_memberInfos.Pop()).Member;
         tableType    = ((PropertyInfo)_tableMember).PropertyType;
         return(GetTable(tableType));
     }
     return(TableInfoManager.GetTable(tableType));
 }
コード例 #4
0
 SchemaModel.Table GetTable(Type tableType)
 {
     if (ParserUtils.IsAnonymousType(tableType))
     {
         _tableMember = _memberInfoStack.Pop();
         tableType    = ((PropertyInfo)_tableMember).PropertyType;
         return(GetTable(tableType));
     }
     return(TableInfoManager.GetTable(tableType));;
 }
コード例 #5
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);
        }
コード例 #6
0
        void ParseEntityType(Type type)
        {
            var tableSechma = TableInfoManager.GetTable(type);
            var tableInfo   = new Table()
            {
                DataBase = tableSechma.DataBase,
                Name     = tableSechma.Name,
                Type     = tableSechma.Type
            };
            var columns = tableSechma.Columns;

            foreach (var columnValue in columns.Values)
            {
                var column = new Column();
                column.Name       = columnValue.Name;
                column.DataType   = columnValue.PropertyInfo.PropertyType;
                column.MemberInfo = columnValue.PropertyInfo;
                column.Table      = tableInfo;
                Columns.Add(column);
                Context.Columns.Add(columnValue.Name, column);
            }
        }
コード例 #7
0
        int IEntityOperator.InsertEntities(ArrayList list)
        {
            if (list.Count <= 0)
            {
                return(0);
            }
            var  type           = list[0].GetType();
            var  table          = TableInfoManager.GetTable(type);
            var  columns        = table.Columns;
            var  keyColumn      = table.Columns.FirstOrDefault(x => x.Value.IsKey).Value;
            var  count          = 0;
            var  maxIndex       = 0;
            bool autoIncreament = keyColumn != null && keyColumn.IsAutoIncreament;
            //SqlExecutor executor = null;
            var getters = ExpressionReflector.GetGetters(type);
            var setters = ExpressionReflector.GetSetters(type);
            Action <object, object> keySetter = null;

            if (keyColumn != null)
            {
                keySetter = setters.Get(keyColumn.PropertyInfo.Name);
            }
            if (!autoIncreament)
            {
                var obj = _sqlExecutor.ExecuteScalar(string.Format("select max(Count) from {0} where Name='{1}'", ConfigManager.SequenceTable, table.Name), new Dictionary <string, object>());
                if (obj == DBNull.Value)
                {
                    _sqlExecutor.ExecuteNonQuery(string.Format("insert into {0}(Name,Count) values('{1}',{2})", ConfigManager.SequenceTable, table.Name, 0), new Dictionary <string, object>());
                }
                else
                {
                    maxIndex = Convert.ToInt32(obj);
                }
            }
            #region 使用Insert语句插入
            int page, limit = 10;
            page = (int)Math.Ceiling(list.Count / (double)limit);
            int pageIndex   = 1;
            var insertStart = "insert into {0}({1}) values{2}";
            var tableName   = string.Empty;
            if (!string.IsNullOrWhiteSpace(table.DataBase))
            {
                tableName = string.Format("[{0}].", table.DataBase);
            }
            tableName = string.Format("[{0}]", table.Name);
            var fields = new List <string>();
            var autoincreamentColumn = string.Empty;
            foreach (var item in table.Columns.Values)
            {
                if (item.IsAutoIncreament)
                {
                    autoincreamentColumn = item.Name;
                    continue;
                }
                fields.Add(item.Name);
            }
            while (pageIndex <= page)
            {
                var       start    = (pageIndex - 1) * limit;
                ArrayList entities = null;
                if (start + limit > list.Count)
                {
                    entities = list.GetRange(start, list.Count - start);
                }
                else
                {
                    entities = list.GetRange(start, limit);
                }
                var values        = new List <string>();
                var index         = 0;
                var sqlParameters = new Dictionary <string, object>();
                foreach (var entity in entities)
                {
                    var value = new List <string>();
                    if (!autoIncreament && keySetter != null)
                    {
                        keySetter(entity, ++maxIndex);
                    }
                    foreach (var key in getters.Keys)
                    {
                        if (autoincreamentColumn == key)
                        {
                            continue;
                        }
                        value.Add(string.Format("@{0}{1}", key, index));
                        var valueParam = getters.Get(key)(entity);
                        var dateValue  = valueParam as DateTime?;
                        if (dateValue != null)
                        {
                            if (dateValue.Value.Date == dateValue.Value)
                            {
                                valueParam = dateValue.Value.ToString("yyyy-MM-dd");
                            }
                            else
                            {
                                valueParam = dateValue.Value.ToString("yyyy-MM-dd HH:mm:ss");
                            }
                        }
                        sqlParameters.Add(key + index, valueParam);
                    }
                    index++;
                    values.Add(string.Format("({0})", string.Join(",", value)));
                }
                insertStart = string.Format(insertStart, tableName, string.Join(",", fields), string.Join(",", values));
                count      += _sqlExecutor.ExecuteNonQuery(insertStart, sqlParameters);
                pageIndex++;
            }

            #endregion
            if (!autoIncreament)
            {
                _sqlExecutor.ExecuteNonQuery(string.Format("update {0} set [Count]={1} where Name='{2}'", ConfigManager.SequenceTable, maxIndex, table.Name), new Dictionary <string, object>());
            }
            return(count);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        int IEntityOperator.InsertEntities(ArrayList list)
        {
            if (list.Count <= 0)
            {
                return(0);
            }
            var  type           = list[0].GetType();
            var  table          = TableInfoManager.GetTable(type);
            var  columns        = table.Columns;
            var  keyColumn      = table.Columns.FirstOrDefault(x => x.Value.IsKey).Value;
            var  count          = 0;
            var  maxIndex       = 0;
            bool autoIncreament = keyColumn != null && keyColumn.IsAutoIncreament;
            //SqlExecutor executor = null;
            var getters = ExpressionReflector.GetGetters(type);
            var setters = ExpressionReflector.GetSetters(type);
            Action <object, object> keySetter = null;

            if (keyColumn != null)
            {
                keySetter = setters.Get(keyColumn.PropertyInfo.Name);
            }
            if (!autoIncreament)
            {
                var obj = _sqlExecutor.ExecuteScalar(string.Format("select max(Count) from {0} where Name='{1}'", ConfigManager.SequenceTable, table.Name), new Dictionary <string, object>());
                if (obj == DBNull.Value)
                {
                    _sqlExecutor.ExecuteNonQuery(string.Format("insert into {0}(Name,Count) values('{1}',{2})", ConfigManager.SequenceTable, table.Name, 0), new Dictionary <string, object>());
                }
                else
                {
                    maxIndex = Convert.ToInt32(obj);
                }
            }
            if (list.Count <= 10)
            {
                #region 使用Insert语句插入
                var insertStart = "insert into {0}({1}) values{2}";
                var tableName   = string.Empty;
                if (!string.IsNullOrWhiteSpace(table.DataBase))
                {
                    tableName = string.Format("[{0}].", table.DataBase);
                }
                tableName = string.Format("[{0}]", table.Name);
                var fields = new List <string>();
                var autoincreamentColumn = string.Empty;
                foreach (var item in table.Columns.Values)
                {
                    if (item.IsAutoIncreament)
                    {
                        autoincreamentColumn = item.Name;
                        continue;
                    }
                    fields.Add(item.Name);
                }
                var values        = new List <string>();
                var index         = 0;
                var sqlParameters = new Dictionary <string, object>();
                foreach (var entity in list)
                {
                    var value = new List <string>();
                    if (!autoIncreament && keySetter != null)
                    {
                        keySetter(entity, ++maxIndex);
                    }
                    foreach (var key in getters.Keys)
                    {
                        if (autoincreamentColumn == key)
                        {
                            continue;
                        }
                        value.Add(string.Format("@{0}{1}", key, index));
                        sqlParameters.Add(key + index, getters.Get(key)(entity));
                    }
                    index++;
                    values.Add(string.Format("({0})", string.Join(",", value)));
                }
                insertStart = string.Format(insertStart, tableName, string.Join(",", fields), string.Join(",", values));
                count       = _sqlExecutor.ExecuteNonQuery(insertStart, sqlParameters);
                #endregion
            }
            else
            {
                #region 使用SqlBulkCopy插入
                var sqlBulkCopy = new SqlBulkCopy(DataContext.ConnectionString);
                sqlBulkCopy.DestinationTableName = "dbo.[" + table.Name + "]";
                if (list.Count > 500000)
                {
                    sqlBulkCopy.BatchSize = list.Count / 10;
                }
                var dataTable = new DataTable();
                foreach (var column in table.Columns.Values)
                {
                    var dataColumn = new DataColumn();
                    dataColumn.ColumnName = column.Name;
                    dataColumn.DataType   = TypeHelper.GetUnderlyingType(column.PropertyInfo.PropertyType);
                    dataTable.Columns.Add(dataColumn);
                    sqlBulkCopy.ColumnMappings.Add(column.Name, column.Name);
                }
                foreach (var item in list)
                {
                    var row = dataTable.NewRow();
                    if (!autoIncreament && keySetter != null)
                    {
                        keySetter(item, ++maxIndex);
                    }
                    foreach (var key in getters.Keys)
                    {
                        row[columns.Get(key).Name] = getters.Get(key)(item);
                    }
                    dataTable.Rows.Add(row);
                }
                sqlBulkCopy.WriteToServer(dataTable);
                sqlBulkCopy.Close();
                #endregion
                count = list.Count;
            }
            if (!autoIncreament)
            {
                _sqlExecutor.ExecuteNonQuery(string.Format("update {0} set [Count]={1} where Name='{2}'", ConfigManager.SequenceTable, maxIndex, table.Name), new Dictionary <string, object>());
            }
            return(count);
        }
コード例 #10
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);
 }