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()); }