Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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())
            {
            }
        }