public async Task <IList <TUser> > GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken)
        {
            var query = from m in membersRepository.GetAll()
                        join c in contentRepository.GetAll() on m.NodeId equals c.NodeId
                        join ct in contentTypeRepository.GetAll() on c.ContentType equals ct.NodeId
                        join m2m in member2MemberGroupRepository.GetAll() on m.NodeId equals m2m.Member into grouping
                        from m2m in grouping.DefaultIfEmpty()
                        join un in umbracoNodeRepository.GetAll() on m2m.MemberGroup equals un.Id into grouping2
                        from un in grouping2.DefaultIfEmpty()
                        join pd in propertyDataRepository.GetAll() on m.NodeId equals pd.ContentNodeId
                        join pt in propertyTypeRepository.GetAll() on pd.PropertyTypeId equals pt.Id
                        where un.Text.ToUpper() == roleName.ToUpper() || ct.Alias.ToUpper().Equals(roleName.ToUpper())
                        select new MemberProperty
            {
                Member       = m,
                PropertyData = pd,
                PropertyType = pt
            };

            var memberProperties = await membersRepository.ToListAsync(query, cancellationToken);

            var membersProp = memberProperties.GroupBy(x => x.Member.NodeId, x => x);

            return(membersProp.Select(x => UmbracoUtils.CreateUserFromProperties <TUser>(x.ToList())).ToList());
        }
        public async Task <TUser> FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken)
        {
            var query = from m in membersRepository.GetAllAsNoTracking()
                        join pd in propertyDataRepository.GetAllAsNoTracking() on m.NodeId equals pd.ContentNodeId
                        join pt in propertyTypeRepository.GetAllAsNoTracking() on pd.PropertyTypeId equals pt.Id
                        where m.Email.ToUpper() == normalizedEmail.ToUpper()
                        select new MemberProperty
            {
                Member       = m,
                PropertyData = pd,
                PropertyType = pt
            };

            var memberProperties = await membersRepository.ToListAsync(query, cancellationToken);

            return(UmbracoUtils.CreateUserFromProperties <TUser>(memberProperties));
        }
        public async Task <TUser> FindByIdAsync(string userId, CancellationToken cancellationToken)
        {
            if (!int.TryParse(userId, out int intUserId))
            {
                throw new ArgumentException(nameof(userId));
            }

            var query = from m in membersRepository.GetAllAsNoTracking()
                        join pd in propertyDataRepository.GetAllAsNoTracking() on m.NodeId equals pd.ContentNodeId
                        join pt in propertyTypeRepository.GetAllAsNoTracking() on pd.PropertyTypeId equals pt.Id
                        where m.NodeId == intUserId
                        select new MemberProperty
            {
                Member       = m,
                PropertyData = pd,
                PropertyType = pt
            };

            var memberProperties = await membersRepository.ToListAsync(query, cancellationToken);

            return(UmbracoUtils.CreateUserFromProperties <TUser>(memberProperties));
        }