Exemplo n.º 1
0
        void BuildDeleteSql()
        {
            var where = string.Empty;
            var table = TableInfoManager.GetTable(_context.ElementType);

            tableName = table.Name;
            var tableFullName = GetTableName(table);

            if (_context.Conditions.Any())
            {
                where = BuildWhere(_context.Conditions);
            }
            var sql = "DELETE FROM {0} {1}";

            sql = string.Format(sql, tableFullName, where);
            _result.CommandText = sql;
        }
Exemplo n.º 2
0
        void BuildUpdateSql()
        {
            var where = string.Empty;
            var table         = TableInfoManager.GetTable(_context.ElementType);
            var keyColumnName = string.Empty;
            var keyColumn     = table.Columns.FirstOrDefault(x => x.Value.IsKey).Value;

            if (keyColumn != null)
            {
                keyColumnName = keyColumn.PropertyInfo.Name;
            }
            tableName = table.Name;
            var tableFullName = GetTableName(table);

            if (_context.Conditions.Any())
            {
                where = BuildWhere(_context.Conditions);
            }
            var setts = new List <string>();
            var alias = string.Empty;

            foreach (var key in _context.UpdateResult.Keys)
            {
                if (key == keyColumnName)
                {
                    continue;
                }
                alias = ParserUtils.GenerateAlias(key);
                var set = string.Format("[{0}] = @{1}", key, alias);
                _result.Parameters.Add(alias, _context.UpdateResult.Get(key));
                setts.Add(set);
            }
            var sql = "UPDATE {0} SET {1} {2}";

            sql = string.Format(sql, tableFullName, string.Join(",", setts), where);
            _result.CommandText = sql;
        }
Exemplo n.º 3
0
        protected string GetTableAlias(string columnName)
        {
            if (!string.IsNullOrWhiteSpace(tableName))
            {
                return(tableName);
            }

            foreach (var join in _context.Joins.Values)
            {
                if (join.Left.Name == columnName)
                {
                    return(join.Left.Table.Alias);
                }
                else if (join.Right.Name == columnName)
                {
                    return(join.Right.Table.Alias);
                }
                var tableInfo = TableInfoManager.GetTable(join.Left.Table.Type);
                foreach (var column in tableInfo.Columns.Values)
                {
                    if (column.Name == columnName)
                    {
                        return(join.Left.Table.Name == tableInfo.Name ? join.Left.Table.Alias : join.Right.Table.Alias);
                    }
                }
                tableInfo = TableInfoManager.GetTable(join.Right.Table.Type);
                foreach (var column in tableInfo.Columns.Values)
                {
                    if (column.Name == columnName)
                    {
                        return(join.Left.Table.Name == tableInfo.Name ? join.Left.Table.Alias : join.Right.Table.Alias);
                    }
                }
            }
            throw new Exception();
        }
Exemplo n.º 4
0
        public int SaveChanges()
        {
            Dictionary <string, object> dbSets;

            if (!_dbSets.TryGetValue(_dataContextType, out dbSets))
            {
                throw new Exception("初始有问题");
            }
            var provider = ProviderFactory.CreateProvider(ConfigManager.DataBaseType);
            var count    = 0;

            using (var scope = new TransactionScope())
            {
                var op = provider.CreateEntityOperator();
                foreach (IEntityOperator dbSet in dbSets.Values)
                {
                    var list  = dbSet.GetAdding();
                    var total = op.InsertEntities(list);
                    if (total != list.Count)
                    {
                        throw new Exception("批量插入失败");
                    }
                    count += total;
                    var editings   = dbSet.GetEditing();
                    var entityType = dbSet.GetEntityType();
                    var table      = TableInfoManager.GetTable(entityType);
                    var keyColumn  = table.Columns.FirstOrDefault(x => x.Value.IsKey).Value;
                    if (keyColumn == null)
                    {
                        throw new InvalidOperationException("实体" + entityType.FullName + "不存在主键,无法更新");
                    }
                    var getters   = ExpressionReflector.GetGetters(entityType);
                    var keyGetter = getters.Get(keyColumn.PropertyInfo.Name);
                    if (keyGetter == null)
                    {
                        throw new InvalidOperationException("keyGetter为null");
                    }
                    foreach (var editing in editings)
                    {
                        var iGetUpdatedValue = editing as IGetUpdatedValues;
                        if (iGetUpdatedValue == null)
                        {
                            continue;
                        }
                        var values = iGetUpdatedValue.GetUpdatedValues();
                        if (values.Count <= 0)
                        {
                            continue;
                        }
                        if (values.Get(keyColumn.PropertyInfo.Name) != null)
                        {
                            throw new InvalidOperationException("不允许更新主键");
                        }
                        var keyValue = keyGetter(editing);
                        values.Add(keyColumn.Name, keyValue);
                        op.UpdateValues(keyColumn, table, values);
                    }

                    var removings = dbSet.GetRemoving();
                    var ids       = new List <int>();
                    foreach (var removing in removings)
                    {
                        var kv = keyGetter(removing);
                        if (kv == null)
                        {
                            throw new InvalidOperationException("删除时主键必须有值");
                        }
                        ids.Add(Convert.ToInt32(kv));
                    }
                    if (ids.Any())
                    {
                        op.Delete(keyColumn, table, ids.ToArray());
                    }
                }
                scope.Complete();
                foreach (IEntityOperator item in dbSets.Values)
                {
                    item.ClearAdding();
                    item.ClearEditing();
                    item.ClearRemoving();
                }
            }
            return(count);
        }
Exemplo n.º 5
0
        public TResult Execute <TResult>(System.Linq.Expressions.Expression expression)
        {
            var provider = ProviderFactory.CreateProvider(ConfigManager.DataBaseType);
            var parser   = provider.CreateParser();

            //var provider = ProviderFactory.CreateProvider(ConfigManager.DataBase);
            //var parser = provider.CreateParser();
            parser.ElementType = _elementType;
            parser.Parse(expression);
            Type type     = typeof(TResult);
            var  executor = provider.CreateSqlExecutor();

            if (expression.NodeType == ExpressionType.Call && type.IsValueType)
            {
                var     method = ((MethodCallExpression)expression).Method;
                object  r;
                DataSet ds;
                switch (method.Name)
                {
                case "Any":
                    ds = executor.ExecuteDataSet(parser.Result.CommandText, parser.Result.Parameters);
                    r  = ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0;
                    return((TResult)r);

                case "Delete":
                case "Update":
                    r = executor.ExecuteNonQuery(parser.Result.CommandText, parser.Result.Parameters);
                    return((TResult)r);

                case "Average":
                case "Sum":
                case "Count":
                    r = executor.ExecuteScalar(parser.Result.CommandText, parser.Result.Parameters);
                    if (r == DBNull.Value)
                    {
                        return(default(TResult));
                    }
                    return((TResult)Convert.ChangeType(r, type));

                default:
                    throw new Exception();
                }
            }
            else
            {
                var  ds          = executor.ExecuteDataSet(parser.Result.CommandText, parser.Result.Parameters);
                bool isValueType = false;
                if (type.IsGenericType)
                {
                    if (typeof(IEnumerable).IsAssignableFrom(type))
                    {
                        var list = EntityMapper.Map(type.GetGenericArguments()[0], ds);
                        if (_context.IsEnableProxy)
                        {
                            if (list.Count > 10)
                            {
                                return((TResult)list);
                            }
                            if (TableInfoManager.IsEntity(type))
                            {
                                for (int i = 0; i < list.Count; i++)
                                {
                                    list[i] = DynamicProxy.CreateDynamicProxy(list[i]);
                                }
                                var entityOp = _context.GetEntityOperator(type);
                                entityOp.AddEditing(list);
                            }
                        }
                        return((TResult)list);
                    }
                    if (typeof(Nullable <>).IsAssignableFrom(type))
                    {
                        isValueType = true;
                    }
                    if (!isValueType)
                    {
                        throw new Exception();
                    }
                }
                if (type.IsValueType || isValueType)
                {
                    if (ds.Tables[0].Rows.Count <= 0)
                    {
                        return(default(TResult));
                    }
                    var result = ds.Tables[0].Rows[0][0];
                    if (result == DBNull.Value)
                    {
                        return(default(TResult));
                    }
                    return((TResult)Convert.ChangeType(result, type));
                }

                if (TableInfoManager.IsEntity(type))
                {
                    var results = EntityMapper.Map(type, ds);
                    if (results.Count <= 0)
                    {
                        return(default(TResult));
                    }
                    var result = results[0];
                    if (_context.IsEnableProxy)
                    {
                        var entityOp = _context.GetEntityOperator(type);
                        result = DynamicProxy.CreateDynamicProxy(result);
                        entityOp.AddEditing(new ArrayList()
                        {
                            result
                        });
                        return((TResult)result);
                    }
                    return((TResult)result);
                }
                throw new Exception();
            }
        }