/// <summary> /// Executes the given SelectQuery and returns the result set transformed back into entity objects. /// Adds each returned object to the internal cache as managed entity /// </summary> /// <param name="query"></param> /// <typeparam name="TEntity"></typeparam> /// <returns></returns> public IEnumerable <TEntity> Select <TEntity>(IQuery <TEntity> query) { var conn = _connection; if (conn.State != ConnectionState.Open) { conn.Open(); } using var cmd = conn.CreateCommand(); cmd.CommandText = query.AsSqlString(); cmd.Transaction = _transaction; foreach (var(type, id, value) in query.GetParameters()) { var param = cmd.CreateParameter(); param.Value = value; param.DbType = type; param.ParameterName = id; cmd.Parameters.Add(param); } using var reader = new CachedDataReader( _ctx.Cache, _ctx.Schema.EntityTypeMap[typeof(TEntity)], cmd.ExecuteReader(), _ctx ); foreach (var cacheEntry in reader.ReadAll()) { RegisterLazyLoader((TEntity)cacheEntry.Object, cacheEntry.Entity, cacheEntry); yield return((TEntity)cacheEntry.Object); } }
/// <summary> /// Executes <see cref="UpdateStatement{TEntity}"/> and updates cached objects /// </summary> /// <param name="stmt"></param> /// <typeparam name="TEntity"></typeparam> public void Update <TEntity>(UpdateStatement <TEntity> stmt) { var conn = _connection; if (conn.State != ConnectionState.Open) { conn.Open(); } using var cmd = conn.CreateCommand(); cmd.CommandText = stmt.AsSqlString(); cmd.Transaction = _transaction; foreach (var(type, id, value) in stmt.GetParameters()) { var param = cmd.CreateParameter(); param.Value = value; param.DbType = type; param.ParameterName = id; cmd.Parameters.Add(param); } using var reader = new CachedDataReader( _ctx.Cache, stmt.Entity, cmd.ExecuteReader(), _ctx ); // consume update query to execute reader foreach (var _ in reader.ReadAll().ToList()) { } }