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(); }
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(); } }
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); }
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); }