/// <summary>
        /// Find entities by expression predicate with pagination
        /// </summary>
        /// <param name="predicate">Expression predicate</param>
        /// <param name="cancellationToken">Cancellation token</param>
        /// <returns>List of stored entities</returns>
        public Task <IEnumerable <T> > ListByQueryAsync(Expression <Func <T, bool> > predicate, long limit, ulong offset,
                                                        CancellationToken cancellationToken = default(CancellationToken))
        {
            Ensure.Argument.NotNull(predicate, nameof(predicate));
            var result = MySqlGenerator.SelectQuery(predicate, offset, limit);

            return(Connection.ExecuteQueryAsync <T>(result.Sql, result.Param, cancellationToken: cancellationToken));
        }
        public Task <T> GetByQueryAsync(Expression <Func <T, bool> > predicate,
                                        CancellationToken cancellationToken = default(CancellationToken))
        {
            var result = MySqlGenerator.SelectQuery(predicate);

            return(Connection.ExecuteQueryFirstOrDefaultAsync <T>(result.Sql, result.Param,
                                                                  cancellationToken: cancellationToken));
        }
 /// <summary>
 /// List all entities with pagination
 /// </summary>
 /// <param name="cancellationToken">Cancellation token</param>
 /// <returns>List of stored entities</returns>
 public Task <IEnumerable <T> > ListAllAsync(long limit, ulong offset,
                                             CancellationToken cancellationToken = default(CancellationToken))
 {
     return(Connection.ExecuteQueryAsync <T>(MySqlGenerator.SelectAllQuery <T>(limit, offset),
                                             cancellationToken: cancellationToken));
 }
 /// <summary>
 /// Update entity
 /// </summary>
 /// <param name="entity">Entity</param>
 /// <param name="cancellationToken">Cancellation token</param>
 public Task UpdateAsync(T entity, CancellationToken cancellationToken = default(CancellationToken))
 {
     return(Connection.ExecuteNonQueryAsync(MySqlGenerator.UpdateQuery <T>(), entity,
                                            cancellationToken: cancellationToken));
 }
 /// <summary>
 /// Create entity
 /// </summary>
 /// <param name="entity">Entity</param>
 /// <param name="cancellationToken">Cancellation token</param>
 public Task <T> CreateAsyncWithResult(T entity, CancellationToken cancellationToken = default(CancellationToken))
 {
     return(Connection.ExecuteQueryFirstOrDefaultAsync <T>(MySqlGenerator.InsertQueryWithResult <T>(), entity,
                                                           cancellationToken: cancellationToken));
 }