Wyszukiwarka - obsługa i sposób implementacji

0

Pisząc sobie stronę dla zabawy, w .net core api oraz React, doszedłem do momentu obsługi wyszukiwarki. Od strony frontu nie ma problemu(REST, tak mniej więcej on).
Wysyłam zapytanie do serwera w stylu

Advert/page=1&producer=bmw&model=e36&fuel=

Na backendzie stworzyłem sobie kontroler Search

public async Task<JsonResult> Get(string page, string producer, string model,string fuel)

Dane z tego przekazuje do modelu logiki, gdzie stworzyłem takiego potworka

var offerList = (await carOfferService.GetAdvertList());
            if (producer != null)
                offerList = offerList.Where(x => x.ProducentName.ToLower() == producer.ToLower()).ToList();
            if (model != null)
                offerList = offerList.Where(x => x.ModelName.ToLower() == model.ToLower()).ToList();
            if (fuel != null)
                offerList = offerList.Where(x => x.Fuel.ToLower() == fuel.ToLower()).ToList();

Dodając jednak kolejne elementy do wyszukiwarki, dostanę straszy kod, z ifami, jak mi kontroler, który będzie przyjmować ogromną ilość argumentów.

Jak taka wyszukiwarka jest obsługiwana poprawnie? Sprawdzałem na otomoto, jak to idzie i tam leci po prostu get z parametrami w url.

3

Masz tu podobny temat:
link

U Ciebie jest trochę słabo bo najpierw wyciągasz wszystko, a potem filtrujesz - i do tego 3 razy. Buduj zapytanie tak żeby dostawać z bazy to co potrzebujesz i nie filtrować już w pamięci.

0

@kzkzg: Dzięki.

A co z parametrami w kontrolerze? inaczej tego nie mogę zrobić?

1

Widzę, że mój post został tutaj "zaimplementowany" to się odniosę do rozwiązania ;-)

Rzeczywiście stanęło na tym, że nie musiałem tego robić tak bardzo uniwersalnie. Wziąłem pod uwagę tylko te najważniejsze filtry. Jedyna różnica to ja nie robię parametrów, tylko robię to jako element routingu.

Z głowy piszę tyle co pamiętam, kod może mieć błędy.
Przykład:

URL: api/v1/documents/bydatesandtype/2019-08-01/2019-08-31/302

Controller

[Route("api/{version}/[controller]/[action]")]
public class DocumentsController
{
   [HttpGet("{dateFrom}/{dateTo}/{type:int}")]
   public async Task<IActionResult> ByDatesAndType([FromRoute]DateTime dateForm, [FromRoute]DateTime dateTo, [FromRoute]int type)
   {
       return Ok(new { Documents = await _documentsService.GetByDatesAndType(dateFrom, dateTo, type) });
   }

Service

public async Task<IEnumerable<Document>> GetByDatesAndType(DateTime dateFrom, DateTime dateTo, int type)
{
   //tutaj mam jeszcze jeden service do SQL, ale go pominę
   //korzystam z Dappera
   using(IDbConnection db = new SqlConnection(ConnectionString))
   {
       return await db.QueryAsync("select * from documents where date between @DateFrom and @DateTo and type = @Type", new { DateFrom = dateFrom, DateTo = dateTo, Type = type});
   }
}

Tak jak pisał @kzkzg, twój serwis powinien zwrócić już gotowe dane. Jeśli potrzebujesz jakiejś dodatkowej logiki to powinno to się odbywać po stronie serwisu, a nie w kontrolerze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1