Ejemplo n.º 1
0
 public async Task <IDictionary <string, string> > GetUserNamesForIdsAsync(IEnumerable <string> userIds, CancellationToken cancellationToken = default)
 {
     return(await Users
            .Where(u => userIds.Distinct().Contains(u.Id))
            .Select(u => new
     {
         u.Id,
         u.FirstName,
         u.MiddleName,
         u.LastName
     })
            .ToDictionaryAsync(
                u => u.Id,
                u => ProjectDbUser.GetDisplayName(u.Id, u.FirstName, u.MiddleName, u.LastName),
                cancellationToken));
 }
        public async Task <ActionResult <IEnumerable <UserDto> > > QueryAsync([Required] string query, [Range(1, QueryResultCountMaxLimit)] int limit = QueryResultCountDefaultLimit)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var queryParts = query.Split(' ', StringSplitOptions.RemoveEmptyEntries).Take(QueryPartCountLimit).ToList();

            if (!queryParts.Any(p => p.Length >= QueryPartMinLength))
            {
                return(new ActionResult <IEnumerable <UserDto> >(Enumerable.Empty <UserDto>()));
            }

            var match = queryParts
                        .Aggregate(PredicateBuilder.New <ProjectDbUser>(false), (pred, part) =>
                                   pred.And(user =>
                                            user.FirstName.Contains(part) || user.MiddleName.Contains(part) ||
                                            user.LastName.Contains(part) || user.Id.StartsWith(part)));

            var queryResult = await _userManager.Users
                              .Where(u => u.Status == CheckinStatus.CheckedIn || u.Status == CheckinStatus.CheckedOutExtended)
                              .Where(match)
                              .Select(u => new
            {
                u.Id,
                u.FirstName,
                u.MiddleName,
                u.LastName,
                u.Email
            })
                              .ToListAsync();

            var comparer = new IndexOfComparer(string.Join(' ', queryParts), StringComparison.CurrentCultureIgnoreCase);

            return(queryResult
                   .Select(u => new UserDto
            {
                Id = u.Id,
                Email = u.Email,
                Name = ProjectDbUser.GetDisplayName(u.Id, u.FirstName, u.MiddleName, u.LastName)
            })
                   .OrderBy(u => u.Name, comparer)
                   .ThenBy(u => u.Name)
                   .Take(limit)
                   .ToList());
        }