public async Task <HashrateChartModel> GetHashrateChart(int poolId, string userId)
        {
            var currentUser = !string.IsNullOrEmpty(userId) ? new Guid(userId) : Guid.Empty;
            var cacheResult = await CacheService.GetOrSetHybridAsync(CacheKey.MineshaftHashrateChart(poolId, currentUser), TimeSpan.FromMinutes(5), async() =>
            {
                using (var context = PoolDataContextFactory.CreateContext())
                {
                    var chartData = new HashrateChartModel();
                    var pool      = await context.Pool.FirstOrDefaultNoLockAsync(x => x.Id == poolId).ConfigureAwait(false);

                    var statInterval     = 30;
                    var finish           = DateTime.UtcNow;
                    var start            = finish.AddHours(-24);
                    var totalChartPoints = (1440 * 1) / statInterval;

                    var shareData = await context.Database.SqlQuery <HashrateChartData>(string.Format(_query, pool.TablePrefix), start).ToListNoLockAsync().ConfigureAwait(false);
                    if (shareData.IsNullOrEmpty())
                    {
                        return(chartData);
                    }

                    var userShareData = new List <HashrateChartData>();
                    if (currentUser != Guid.Empty)
                    {
                        userShareData = await context.Database.SqlQuery <HashrateChartData>(string.Format(_userQuery, pool.TablePrefix), currentUser, start).ToListNoLockAsync().ConfigureAwait(false);
                    }

                    for (int i = 0; i < totalChartPoints; i++)
                    {
                        var rangeStart = start.AddMinutes(i *statInterval);
                        var rangeEnd   = rangeStart.AddMinutes(statInterval);
                        var data       = shareData.FirstOrDefault(x => x.Timestamp > rangeStart && x.Timestamp <= rangeEnd);
                        var javaTime   = rangeStart.ToJavaTime();

                        var statPeriod = i == totalChartPoints
                                                        ? (data.LastTime - rangeStart).TotalMinutes
                                                        : statInterval * 60;

                        var hashrate = data != null ? PoolExtensions.CalculateHashrate(data.Shares, pool.AlgoType, statPeriod) : 0.0;
                        chartData.PoolData.Add(new[] { javaTime, hashrate });

                        if (currentUser != Guid.Empty)
                        {
                            var userData     = userShareData.FirstOrDefault(x => x.Timestamp > rangeStart && x.Timestamp <= rangeEnd);
                            var userHashrate = userData != null ? PoolExtensions.CalculateHashrate(userData.Shares, pool.AlgoType, statPeriod) : 0.0;
                            chartData.UserData.Add(new[] { javaTime, userHashrate });
                        }
                    }
                    return(chartData);
                }
            }).ConfigureAwait(false);

            return(cacheResult);
        }