public IEnumerable <T> Execute(IEnumerable <object> input)
 {
     using (var conn = _connectionProvider())
     {
         conn.Open();
         var cmd = conn.CreateCommand();
         using (cmd)
         {
             cmd.CommandText = _query;
             cmd.CommandType = CommandType.Text;
             using (var rdr = cmd.ExecuteReader())
             {
                 while (rdr.Read())
                 {
                     var instance = CreateInstance();
                     for (var i = 0; i < rdr.FieldCount; i++)
                     {
                         var value = rdr.IsDBNull(i) ? null : rdr[i];
                         SetterDelegateCache <T> .Write(i, instance, value);
                     }
                     yield return(instance);
                 }
             }
         }
     }
 }
        /// <summary>
        /// Creates a new object instance from a data row
        /// </summary>
        /// <typeparam name="T">The type of object to create</typeparam>
        /// <param name="row">DataRow containing values</param>
        /// <param name="constructor">Method used to create a new instance.</param>
        /// <returns>A new instance of <typeparamref name="T"/> filled with values from <paramref name="row"/>.</returns>
        public static T ToInstance <T>(this DataRow row, Func <T> constructor)
        {
            var retval = constructor();

            foreach (var propertyName in SetterDelegateCache <T> .WritablePropertyNames)
            {
                var value = row.IsNull(propertyName) ? null : row[propertyName];
                SetterDelegateCache <T> .Write(propertyName, retval, value);
            }

            return(retval);
        }