/// <summary> /// Search the personal & national Pokedex given search parameters. /// Only search national dex if Pokeball is not selected. /// </summary> /// <param name="searchViewModel">search parameters to filter on</param> /// <returns>filtered search results</returns> public async Task <SearchViewModel> Search(SearchViewModel searchViewModel) { SearchViewModel finalSearchViewModel = await GetSearchForm(); int?selectedAbilityId = searchViewModel.SelectedAbilityId; int?selectedCategoryId = searchViewModel.SelectedCategoryId; int?selectedPokeballId = searchViewModel.SelectedPokeballId; int?selectedTypeId = searchViewModel.SelectedTypeId; finalSearchViewModel.SelectedAbilityId = selectedAbilityId; finalSearchViewModel.SelectedCategoryId = selectedCategoryId; finalSearchViewModel.SelectedPokeballId = selectedPokeballId; finalSearchViewModel.SelectedTypeId = selectedTypeId; finalSearchViewModel.FilteredPokemon = new List <PokemonListingViewModel>(); List <tblMyPokedex> pokedex = await _pokedexRepository.Search(searchViewModel.SearchString, selectedAbilityId, selectedCategoryId, selectedTypeId, selectedPokeballId); _logger.LogInformation(string.Format(Constants.InformationalMessageMappingWithCount, pokedex.Count, Constants.Pokemon, ViewModels)); List <PokemonListingViewModel> pokemonListingViewModels = _mapper.Map <List <PokemonListingViewModel> >(pokedex); finalSearchViewModel.FilteredPokemon.AddRange(pokemonListingViewModels); if (!selectedPokeballId.HasValue) { List <tlkpNationalDex> nationalDex = await _pokedexRepository.Search(searchViewModel.SearchString, selectedAbilityId, selectedCategoryId, selectedTypeId); pokemonListingViewModels = MapNationalDexLookupsToListingViewModels(nationalDex); finalSearchViewModel.FilteredPokemon.AddRange(pokemonListingViewModels); } return(finalSearchViewModel); }