public Task <IEnumerable <Consent> > LoadAllAsync(string subject)
        {
            Preconditions.IsShortString(subject, nameof(subject));

            return(_conn.ExecuteCommand(_loadAllQuery, async cmd =>
            {
                cmd.Parameters.AddWithValue("subject", subject);

                var consentList = new List <Consent>();

                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    var hasMoreRowsTask = reader.ReadAsync();
                    while (await hasMoreRowsTask)
                    {
                        var row = ConsentRow.Read(reader);

                        hasMoreRowsTask = reader.ReadAsync();

                        consentList.Add(row.ToConsent());
                    }
                }

                return (IEnumerable <Consent>)consentList;
            }));
        }
        public Task <Consent> LoadAsync(string subject, string client)
        {
            Preconditions.IsShortString(subject, nameof(subject));
            Preconditions.IsShortString(client, nameof(client));

            return(_conn.ExecuteCommand(_loadQuery, async cmd =>
            {
                cmd.Parameters.AddWithValue("@subject", subject);
                cmd.Parameters.AddWithValue("@client", client);

                Consent consent;

                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    if (await reader.ReadAsync())
                    {
                        var row = ConsentRow.Read(reader);

                        consent = row.ToConsent();
                    }
                    else
                    {
                        consent = null;
                    }
                }

                return consent;
            }));
        }
        public async Task UpdateAsync(Consent consent)
        {
            Preconditions.IsNotNull(consent, nameof(consent));

            var consentExistsTask = ConsentExistsInTable(consent);
            var row = ConsentRow.Convert(consent);

            if (await consentExistsTask)
            {
                // Update
                await _conn.ExecuteCommand(_updateQuery, async cmd =>
                {
                    cmd.Parameters.AddWithValue("subject", row.Subject);
                    cmd.Parameters.AddWithValue("client", row.ClientId);
                    cmd.Parameters.AddWithValue("scopes", row.ScopesAsString);

                    int rowsAffected = await cmd.ExecuteNonQueryAsync();

                    return(rowsAffected);
                });
            }
            else
            {
                // Insert
                await _conn.ExecuteCommand(_insertQuery, async cmd =>
                {
                    cmd.Parameters.AddWithValue("subject", row.Subject);
                    cmd.Parameters.AddWithValue("client", row.ClientId);
                    cmd.Parameters.AddWithValue("scopes", row.ScopesAsString);

                    int rowsAffected = await cmd.ExecuteNonQueryAsync();

                    return(rowsAffected);
                });
            }
        }