Ejemplo n.º 1
0
        public IEnumerable <IMember> FindMembersInRole(string roleName, string usernameToMatch,
                                                       StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
        {
            //get the group id
            IQuery <IMemberGroup> grpQry      = Query <IMemberGroup>().Where(group => group.Name.Equals(roleName));
            IMemberGroup          memberGroup = _memberGroupRepository.Get(grpQry).FirstOrDefault();

            if (memberGroup == null)
            {
                return(Enumerable.Empty <IMember>());
            }

            // get the members by username
            IQuery <IMember> query = Query <IMember>();

            switch (matchType)
            {
            case StringPropertyMatchType.Exact:
                query.Where(member => member.Username.Equals(usernameToMatch));
                break;

            case StringPropertyMatchType.Contains:
                query.Where(member => member.Username.Contains(usernameToMatch));
                break;

            case StringPropertyMatchType.StartsWith:
                query.Where(member => member.Username.StartsWith(usernameToMatch));
                break;

            case StringPropertyMatchType.EndsWith:
                query.Where(member => member.Username.EndsWith(usernameToMatch));
                break;

            case StringPropertyMatchType.Wildcard:
                query.Where(member => member.Username.SqlWildcard(usernameToMatch, TextColumnType.NVarchar));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(matchType));
            }

            IMember[] matchedMembers = Get(query).ToArray();

            var membersInGroup = new List <IMember>();

            //then we need to filter the matched members that are in the role
            foreach (IEnumerable <int> group in matchedMembers.Select(x => x.Id)
                     .InGroupsOf(Constants.Sql.MaxParameterCount))
            {
                Sql <ISqlContext> sql = Sql().SelectAll().From <Member2MemberGroupDto>()
                                        .Where <Member2MemberGroupDto>(dto => dto.MemberGroup == memberGroup.Id)
                                        .WhereIn <Member2MemberGroupDto>(dto => dto.Member, group);

                var memberIdsInGroup = Database.Fetch <Member2MemberGroupDto>(sql)
                                       .Select(x => x.Member).ToArray();

                membersInGroup.AddRange(matchedMembers.Where(x => memberIdsInGroup.Contains(x.Id)));
            }

            return(membersInGroup);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Finds a list of <see cref="IUser"/> objects by a partial username
        /// </summary>
        /// <param name="login">Partial username to match</param>
        /// <param name="pageIndex">Current page index</param>
        /// <param name="pageSize">Size of the page</param>
        /// <param name="totalRecords">Total number of records found (out)</param>
        /// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
        /// <returns><see cref="IEnumerable{IUser}"/></returns>
        public IEnumerable <IUser> FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
        {
            var uow = UowProvider.GetUnitOfWork();

            using (var repository = RepositoryFactory.CreateUserRepository(uow))
            {
                var query = new Query <IUser>();

                switch (matchType)
                {
                case StringPropertyMatchType.Exact:
                    query.Where(member => member.Username.Equals(login));
                    break;

                case StringPropertyMatchType.Contains:
                    query.Where(member => member.Username.Contains(login));
                    break;

                case StringPropertyMatchType.StartsWith:
                    query.Where(member => member.Username.StartsWith(login));
                    break;

                case StringPropertyMatchType.EndsWith:
                    query.Where(member => member.Username.EndsWith(login));
                    break;

                case StringPropertyMatchType.Wildcard:
                    query.Where(member => member.Email.SqlWildcard(login, TextColumnType.NVarchar));
                    break;

                default:
                    throw new ArgumentOutOfRangeException("matchType");
                }

                return(repository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, dto => dto.Username));
            }
        }
Ejemplo n.º 3
0
        public IEnumerable <IMember> FindMembersInRole(string roleName, string usernameToMatch, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
        {
            //get the group id
            var grpQry      = Query <IMemberGroup>().Where(group => group.Name.Equals(roleName));
            var memberGroup = _memberGroupRepository.Get(grpQry).FirstOrDefault();

            if (memberGroup == null)
            {
                return(Enumerable.Empty <IMember>());
            }

            // get the members by username
            var query = Query <IMember>();

            switch (matchType)
            {
            case StringPropertyMatchType.Exact:
                query.Where(member => member.Username.Equals(usernameToMatch));
                break;

            case StringPropertyMatchType.Contains:
                query.Where(member => member.Username.Contains(usernameToMatch));
                break;

            case StringPropertyMatchType.StartsWith:
                query.Where(member => member.Username.StartsWith(usernameToMatch));
                break;

            case StringPropertyMatchType.EndsWith:
                query.Where(member => member.Username.EndsWith(usernameToMatch));
                break;

            case StringPropertyMatchType.Wildcard:
                query.Where(member => member.Username.SqlWildcard(usernameToMatch, TextColumnType.NVarchar));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(matchType));
            }
            var matchedMembers = Get(query).ToArray();

            var membersInGroup = new List <IMember>();
            //then we need to filter the matched members that are in the role
            //since the max sql params are 2100 on sql server, we'll reduce that to be safe for potentially other servers and run the queries in batches
            var inGroups = matchedMembers.InGroupsOf(1000);

            foreach (var batch in inGroups)
            {
                var memberIdBatch = batch.Select(x => x.Id);
                var sql           = Sql().SelectAll().From <Member2MemberGroupDto>()
                                    .Where <Member2MemberGroupDto>(dto => dto.MemberGroup == memberGroup.Id)
                                    .Where("Member IN (@memberIds)", new { memberIds = memberIdBatch });
                var memberIdsInGroup = Database.Fetch <Member2MemberGroupDto>(sql)
                                       .Select(x => x.Member).ToArray();

                membersInGroup.AddRange(matchedMembers.Where(x => memberIdsInGroup.Contains(x.Id)));
            }

            return(membersInGroup);
        }
Ejemplo n.º 4
0
    /// <summary>
    ///     Finds a list of <see cref="IUser" /> objects by a partial username
    /// </summary>
    /// <param name="login">Partial username to match</param>
    /// <param name="pageIndex">Current page index</param>
    /// <param name="pageSize">Size of the page</param>
    /// <param name="totalRecords">Total number of records found (out)</param>
    /// <param name="matchType">
    ///     The type of match to make as <see cref="StringPropertyMatchType" />. Default is
    ///     <see cref="StringPropertyMatchType.StartsWith" />
    /// </param>
    /// <returns>
    ///     <see cref="IEnumerable{IUser}" />
    /// </returns>
    public IEnumerable <IUser> FindByUsername(string login, long pageIndex, int pageSize, out long totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
    {
        using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true))
        {
            IQuery <IUser> query = Query <IUser>();

            switch (matchType)
            {
            case StringPropertyMatchType.Exact:
                query?.Where(member => member.Username.Equals(login));
                break;

            case StringPropertyMatchType.Contains:
                query?.Where(member => member.Username.Contains(login));
                break;

            case StringPropertyMatchType.StartsWith:
                query?.Where(member => member.Username.StartsWith(login));
                break;

            case StringPropertyMatchType.EndsWith:
                query?.Where(member => member.Username.EndsWith(login));
                break;

            case StringPropertyMatchType.Wildcard:
                query?.Where(member => member.Email.SqlWildcard(login, TextColumnType.NVarchar));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(matchType));
            }

            return(_userRepository.GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, dto => dto.Username));
        }
    }