/// <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));
        }