private NHSessionStatistics Get(IStatistics statistics)
        {
            try
            {
                if (statistics == null)
                {
                    return(null);
                }

                var result = new NHSessionStatistics();

                result.CloseStatementCount     = statistics.CloseStatementCount;
                result.CollectionFetchCount    = statistics.CollectionFetchCount;
                result.CollectionLoadCount     = statistics.CollectionLoadCount;
                result.CollectionRecreateCount = statistics.CollectionRecreateCount;
                result.CollectionRemoveCount   = statistics.CollectionRemoveCount;

                result.CollectionRoleNames              = statistics.CollectionRoleNames;
                result.EntityNames                      = statistics.EntityNames;
                result.Queries                          = statistics.Queries;
                result.SecondLevelCacheRegionNames      = statistics.SecondLevelCacheRegionNames;
                result.QueryExecutionMaxTimeQueryString = statistics.QueryExecutionMaxTimeQueryString;

                result.CollectionUpdateCount      = statistics.CollectionUpdateCount;
                result.ConnectCount               = statistics.ConnectCount;
                result.EntityDeleteCount          = statistics.EntityDeleteCount;
                result.EntityFetchCount           = statistics.EntityFetchCount;
                result.EntityInsertCount          = statistics.EntityInsertCount;
                result.EntityLoadCount            = statistics.EntityLoadCount;
                result.EntityUpdateCount          = statistics.EntityUpdateCount;
                result.FlushCount                 = statistics.FlushCount;
                result.OperationThreshold         = statistics.OperationThreshold;
                result.OptimisticFailureCount     = statistics.OptimisticFailureCount;
                result.PrepareStatementCount      = statistics.PrepareStatementCount;
                result.QueryCacheHitCount         = statistics.QueryCacheHitCount;
                result.QueryCacheMissCount        = statistics.QueryCacheMissCount;
                result.QueryCachePutCount         = statistics.QueryCachePutCount;
                result.QueryExecutionCount        = statistics.QueryExecutionCount;
                result.QueryExecutionMaxTime      = statistics.QueryExecutionMaxTime;
                result.SecondLevelCacheHitCount   = statistics.SecondLevelCacheHitCount;
                result.SecondLevelCacheMissCount  = statistics.SecondLevelCacheMissCount;
                result.SecondLevelCachePutCount   = statistics.SecondLevelCachePutCount;
                result.SessionCloseCount          = statistics.SessionCloseCount;
                result.SessionOpenCount           = statistics.SessionOpenCount;
                result.SuccessfulTransactionCount = statistics.SuccessfulTransactionCount;
                result.TransactionCount           = statistics.TransactionCount;

                return(result);
            }
            catch (Exception e)
            {
                _genericLog.Error($"{_nameOfThis} - Exception while Getting Statistics: {e.Message}");
                _genericLog.Debug($"{_nameOfThis} - Exception while Getting Statistics: {e.StackTrace}");
                if (!ContinueOnError)
                {
                    throw;
                }
                return(null);
            }
        }
        }//end ctor()

        public void Capture(IStatistics statistics, MonitorStatus status)
        {
            switch (status)
            {
            case MonitorStatus.None:
                break;

            case MonitorStatus.Stopped:
                _currentStatistics = Get(statistics);
                break;

            case MonitorStatus.Running:
                _previousStatistics = Get(statistics);
                break;

            default:
                break;
            }
        }
        public NHSessionStatistics Get()
        {
            try
            {
                if (_previousStatistics == null || _currentStatistics == null)
                {
                    return(null);
                }

                var result = new NHSessionStatistics();

                result.CloseStatementCount     = _currentStatistics?.CloseStatementCount - _previousStatistics?.CloseStatementCount;
                result.CollectionFetchCount    = _currentStatistics?.CollectionFetchCount - _previousStatistics?.CollectionFetchCount;
                result.CollectionLoadCount     = _currentStatistics?.CollectionLoadCount - _previousStatistics?.CollectionLoadCount;
                result.CollectionRecreateCount = _currentStatistics?.CollectionRecreateCount - _previousStatistics?.CollectionRecreateCount;
                result.CollectionRemoveCount   = _currentStatistics?.CollectionRemoveCount - _previousStatistics?.CollectionRemoveCount;

                switch (_unionType)
                {
                case UnionType.Union:
                    result.CollectionRoleNames              = _currentStatistics?.CollectionRoleNames.Union(_previousStatistics?.CollectionRoleNames).ToArray();
                    result.EntityNames                      = _currentStatistics?.EntityNames.Union(_previousStatistics?.EntityNames).ToArray();
                    result.Queries                          = _currentStatistics?.Queries.Union(_previousStatistics?.Queries).ToArray();
                    result.SecondLevelCacheRegionNames      = _currentStatistics?.SecondLevelCacheRegionNames.Union(_previousStatistics?.SecondLevelCacheRegionNames).ToArray();
                    result.QueryExecutionMaxTimeQueryString = _currentStatistics?.QueryExecutionMaxTimeQueryString;
                    break;

                case UnionType.Current:
                    result.CollectionRoleNames              = _currentStatistics?.CollectionRoleNames;
                    result.EntityNames                      = _currentStatistics?.EntityNames;
                    result.Queries                          = _currentStatistics?.Queries;
                    result.SecondLevelCacheRegionNames      = _currentStatistics?.SecondLevelCacheRegionNames;
                    result.QueryExecutionMaxTimeQueryString = _currentStatistics?.QueryExecutionMaxTimeQueryString;
                    break;

                case UnionType.Previous:
                    result.CollectionRoleNames              = _previousStatistics?.CollectionRoleNames;
                    result.EntityNames                      = _previousStatistics?.EntityNames;
                    result.Queries                          = _previousStatistics?.Queries;
                    result.SecondLevelCacheRegionNames      = _previousStatistics?.SecondLevelCacheRegionNames;
                    result.QueryExecutionMaxTimeQueryString = _previousStatistics?.QueryExecutionMaxTimeQueryString;
                    break;

                case UnionType.OnlyCurrent:
                    result.CollectionRoleNames              = _currentStatistics?.CollectionRoleNames.Except(_previousStatistics?.CollectionRoleNames).ToArray();
                    result.EntityNames                      = _currentStatistics?.EntityNames.Except(_previousStatistics?.EntityNames).ToArray();
                    result.Queries                          = _currentStatistics?.Queries.Except(_previousStatistics?.Queries).ToArray();
                    result.SecondLevelCacheRegionNames      = _currentStatistics?.SecondLevelCacheRegionNames.Except(_previousStatistics?.SecondLevelCacheRegionNames).ToArray();
                    result.QueryExecutionMaxTimeQueryString = _currentStatistics?.QueryExecutionMaxTimeQueryString;
                    break;

                case UnionType.OnlyPrevious:
                    result.CollectionRoleNames              = _previousStatistics?.CollectionRoleNames.Except(_currentStatistics?.CollectionRoleNames).ToArray();
                    result.EntityNames                      = _previousStatistics?.EntityNames.Except(_currentStatistics?.EntityNames).ToArray();
                    result.Queries                          = _previousStatistics?.Queries.Except(_currentStatistics?.Queries).ToArray();
                    result.SecondLevelCacheRegionNames      = _previousStatistics?.SecondLevelCacheRegionNames.Except(_currentStatistics?.SecondLevelCacheRegionNames).ToArray();
                    result.QueryExecutionMaxTimeQueryString = _previousStatistics?.QueryExecutionMaxTimeQueryString;
                    break;

                case UnionType.Ignore:
                    break;

                default:
                    break;
                }

                result.CollectionUpdateCount      = _currentStatistics?.CollectionUpdateCount - _previousStatistics?.CollectionUpdateCount;
                result.ConnectCount               = _currentStatistics?.ConnectCount - _previousStatistics?.ConnectCount;
                result.EntityDeleteCount          = _currentStatistics?.EntityDeleteCount - _previousStatistics?.EntityDeleteCount;
                result.EntityFetchCount           = _currentStatistics?.EntityFetchCount - _previousStatistics?.EntityFetchCount;
                result.EntityInsertCount          = _currentStatistics?.EntityInsertCount - _previousStatistics?.EntityInsertCount;
                result.EntityLoadCount            = _currentStatistics?.EntityLoadCount - _previousStatistics?.EntityLoadCount;
                result.EntityUpdateCount          = _currentStatistics?.EntityUpdateCount - _previousStatistics?.EntityUpdateCount;
                result.FlushCount                 = _currentStatistics?.FlushCount - _previousStatistics?.FlushCount;
                result.OperationThreshold         = _currentStatistics?.OperationThreshold - _previousStatistics?.OperationThreshold;
                result.OptimisticFailureCount     = _currentStatistics?.OptimisticFailureCount - _previousStatistics?.OptimisticFailureCount;
                result.PrepareStatementCount      = _currentStatistics?.PrepareStatementCount - _previousStatistics?.PrepareStatementCount;
                result.QueryCacheHitCount         = _currentStatistics?.QueryCacheHitCount - _previousStatistics?.QueryCacheHitCount;
                result.QueryCacheMissCount        = _currentStatistics?.QueryCacheMissCount - _previousStatistics?.QueryCacheMissCount;
                result.QueryCachePutCount         = _currentStatistics?.QueryCachePutCount - _previousStatistics?.QueryCachePutCount;
                result.QueryExecutionCount        = _currentStatistics?.QueryExecutionCount - _previousStatistics?.QueryExecutionCount;
                result.QueryExecutionMaxTime      = _currentStatistics?.QueryExecutionMaxTime - _previousStatistics?.QueryExecutionMaxTime;
                result.SecondLevelCacheHitCount   = _currentStatistics?.SecondLevelCacheHitCount - _previousStatistics?.SecondLevelCacheHitCount;
                result.SecondLevelCacheMissCount  = _currentStatistics?.SecondLevelCacheMissCount - _previousStatistics?.SecondLevelCacheMissCount;
                result.SecondLevelCachePutCount   = _currentStatistics?.SecondLevelCachePutCount - _previousStatistics?.SecondLevelCachePutCount;
                result.SessionCloseCount          = _currentStatistics?.SessionCloseCount - _previousStatistics?.SessionCloseCount;
                result.SessionOpenCount           = _currentStatistics?.SessionOpenCount - _previousStatistics?.SessionOpenCount;
                result.SuccessfulTransactionCount = _currentStatistics?.SuccessfulTransactionCount - _previousStatistics?.SuccessfulTransactionCount;
                result.TransactionCount           = _currentStatistics?.TransactionCount - _previousStatistics?.TransactionCount;

                return(result);
            }
            catch (Exception e)
            {
                _genericLog.Error($"{_nameOfThis} - Exception while Calculating Statistics: {e.Message}");
                _genericLog.Debug($"{_nameOfThis} - Exception while Calculating Statistics: {e.StackTrace}");
                if (!ContinueOnError)
                {
                    throw;
                }
                return(null);
            }
        }//end Get()