public async Task <IReadOnlyCollection <ISearchResult> > SearchAsync(int?currentUserId, string searchString)
        {
            int?idToFind = SearchKeywordsResolver.TryGetId(
                searchString,
                keysForPerfectMath,
                out var matchByIdIsPerfect);

            if (idToFind == null)
            {
                //Only search by Id is valid for claims
                return(new ReadOnlyCollection <ISearchResult>(new List <ISearchResult>()));
            }

            var results =
                await
                UnitOfWork.GetDbSet <Claim>()
                .Where(claim => claim.ClaimId == idToFind)
                .ToListAsync();

            return(results
                   .Where(claim => claim.HasMasterAccess(currentUserId))
                   .Select(claim => new SearchResultImpl
            {
                LinkType = LinkType.Claim,
                Name = claim.Name,
                Description = new MarkdownString(WorldObjectProviderBase.GetFoundByIdDescription(claim.ClaimId)),
                Identification = claim.ClaimId.ToString(),
                ProjectId = claim.ProjectId,
                IsPublic = false,
                IsActive = claim.ClaimStatus.IsActive(),
                IsPerfectMatch = claim.ClaimId == idToFind && matchByIdIsPerfect,
            })
                   .ToList());
        }
        public async Task <IReadOnlyCollection <ISearchResult> > SearchAsync(int?currentUserId, string searchString)
        {
            bool matchByIdIsPerfect;
            int? idToFind = SearchKeywordsResolver.TryGetId(
                searchString,
                keysForPerfectMath,
                out matchByIdIsPerfect);

            var results =
                await
                UnitOfWork.GetDbSet <User>()
                .Where(user =>
                       //TODO There should be magic way to do this. Experiment with Expression.Voodoo
                       user.UserId == idToFind ||
                       user.Email.Contains(searchString) ||
                       user.FatherName.Contains(searchString) ||
                       user.BornName.Contains(searchString) ||
                       user.SurName.Contains(searchString) ||
                       user.PrefferedName.Contains(searchString) ||
                       (user.Extra != null && user.Extra.Nicknames != null && user.Extra.Nicknames.Contains(searchString))
                       )
                .ToListAsync();

            return(results.Select(user =>
            {
                bool wasfoundById = user.UserId == idToFind;
                var description = new MarkdownString(wasfoundById
          ? WorldObjectProviderBase.GetFoundByIdDescription(user.UserId)
          : "");

                return new SearchResultImpl
                {
                    LinkType = LinkType.ResultUser,
                    Name = user.GetDisplayName(),
                    Description = description,
                    Identification = user.UserId.ToString(),
                    ProjectId = null, //Users not associated with any project
                    IsPublic = true,
                    IsActive = true,
                    IsPerfectMatch = wasfoundById && matchByIdIsPerfect,
                };
            }).ToList());
        }