Exemple #1
0
        private void Update(object entity, object[] originalValues)
        {
            var state  = CreateState(entity);
            var index  = 0;
            var em     = Factory.Mappings.MappingsByType[entity.GetType()];
            var update = new List <Tuple <MapMapping, object> >();

            foreach (var map in em.Maps)
            {
                if (state[index] != originalValues[index])
                {
                    update.Add(new Tuple <MapMapping, object>(map, state[index]));
                    index++;
                }
            }

            if (index == 0)
            {
                return;
            }

            var queryPlan = Parser.Update(entity, update);
            var processor = new MsSqlProcessor();
            var command   = processor.Process(queryPlan, this);

            command.Connection = DbConnection;
            if (DbConnection.State != ConnectionState.Open)
            {
                command.Connection.Open();
            }
            command.ExecuteNonQuery();
        }
Exemple #2
0
        private void Insert(object entity)
        {
            var queryPlan = Parser.Insert(entity);

            var processor = new MsSqlProcessor();

            using (var command = processor.Process(queryPlan, this))
            {
                command.Connection = DbConnection;
                if (DbConnection.State != ConnectionState.Open)
                {
                    command.Connection.Open();
                }
                command.ExecuteNonQuery();
            }
        }
Exemple #3
0
        public IList <TEntity> Execute <TEntity>(Query <TEntity> query)
        {
            var queryPlan  = Parser.Parse(query);
            var expression = queryPlan.Expression as QueryTree.SelectExpression;

            if (expression == null)
            {
                throw new NullReferenceException(nameof(expression));
            }
            var processor = new MsSqlProcessor();
            var list      = new List <TEntity>();
            var cstr      = typeof(TEntity).GetConstructor(new Type[0]);

            if (cstr == null)
            {
                throw new NoDefaultConstructorException();
            }

            using (var command = processor.Process(queryPlan, this))
            {
                command.Connection = query.Session.DbConnection;
                if (query.Session.DbConnection.State != ConnectionState.Open)
                {
                    command.Connection.Open();
                }
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var t = (TEntity)cstr.Invoke(null);
                        foreach (var prop in expression.Values)
                        {
                            var ordinal = reader.GetOrdinal(prop.Alias);
                            var value   = reader.GetValue(ordinal);
                            prop.MapMapping.Property.SetValue(t, value);
                        }
                        query.Session.Attach(t);
                        list.Add(t);
                    }
                }
            }

            return(list);
        }
Exemple #4
0
        public IList <T> Execute <T, TEntity>(Projection <T, TEntity> projection)
        {
            var queryPlan  = Parser.Parse(projection);
            var expression = queryPlan.Expression;

            if (expression == null)
            {
                throw new NullReferenceException(nameof(expression));
            }
            var processor = new MsSqlProcessor();
            var list      = new List <T>();
            var cstr      = queryPlan.Constructor.Constructor;

            using (var command = processor.Process(queryPlan.Expression, queryPlan.Parameters, this))
            {
                command.Connection = DbConnection;
                if (DbConnection.State != ConnectionState.Open)
                {
                    command.Connection.Open();
                }
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var args = queryPlan.Constructor.ConstructorArguments.Select(prop =>
                        {
                            var ordinal = reader.GetOrdinal(prop.Expression.Alias);
                            return(reader.GetValue(ordinal));
                        }).ToArray();
                        var t = (T)cstr.Invoke(args);
                        foreach (var prop in queryPlan.Constructor.MemberAssignments)
                        {
                            var ordinal = reader.GetOrdinal(prop.Expression.Alias);
                            var value   = reader.GetValue(ordinal);
                            ((PropertyInfo)prop.Member).SetValue(t, value);
                        }
                        list.Add(t);
                    }
                }
            }

            return(list);
        }