internal IEnumerable <Guid> GetUserGroupsGuids(int tenantId, Guid userID)
        {
            var httpRequestDictionary = new HttpRequestDictionary <List <Guid> >(Accessor?.HttpContext, "GroupInfoID");
            var fromCache             = httpRequestDictionary.Get(userID.ToString());

            if (fromCache != null)
            {
                return(fromCache);
            }

            var result = new List <Guid>();

            var refs = GetRefsInternal(tenantId);

            if (refs is UserGroupRefStore store)
            {
                var userRefs = store.GetRefsByUser(userID);

                if (userRefs != null)
                {
                    var toAdd = userRefs.Where(r => !r.Removed &&
                                               r.RefType == UserGroupRefType.Contains &&
                                               !Constants.BuildinGroups.Any(g => g.ID.Equals(r.GroupId)))
                                .Select(r => r.GroupId);
                    result.AddRange(toAdd);
                }
            }

            httpRequestDictionary.Add(userID.ToString(), result);

            return(result);
        }
        internal List <GroupInfo> GetUserGroups(Tenant tenant, Guid userID, IncludeType includeType, Guid?categoryId)
        {
            var httpRequestDictionary = new HttpRequestDictionary <List <GroupInfo> >(Accessor?.HttpContext, "GroupInfo");
            var fromCache             = httpRequestDictionary.Get(userID.ToString());

            if (fromCache != null)
            {
                return(fromCache);
            }

            var result             = new List <GroupInfo>();
            var distinctUserGroups = new List <GroupInfo>();

            var refs = GetRefsInternal(tenant.TenantId);
            IEnumerable <UserGroupRef> userRefs = null;

            if (refs is UserGroupRefStore store)
            {
                userRefs = store.GetRefsByUser(userID);
            }

            var userRefsContainsNotRemoved = userRefs?.Where(r => !r.Removed && r.RefType == UserGroupRefType.Contains).ToList();

            foreach (var g in GetGroupsInternal(tenant.TenantId).Where(g => !categoryId.HasValue || g.CategoryID == categoryId))
            {
                if (((g.CategoryID == Constants.SysGroupCategoryId || userRefs == null) && IsUserInGroupInternal(tenant, userID, g.ID, refs)) ||
                    (userRefsContainsNotRemoved != null && userRefsContainsNotRemoved.Any(r => r.GroupId == g.ID)))
                {
                    distinctUserGroups.Add(g);
                }
            }

            if (IncludeType.Distinct == (includeType & IncludeType.Distinct))
            {
                result.AddRange(distinctUserGroups);
            }

            result.Sort((group1, group2) => string.Compare(group1.Name, group2.Name, StringComparison.Ordinal));

            httpRequestDictionary.Add(userID.ToString(), result);

            return(result);
        }