Wyszukiwarka - obsługa i sposób implementacji

Odpowiedz Nowy wątek
2019-09-03 21:04
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.

Pozostało 580 znaków

2019-09-03 21:12
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.

edytowany 3x, ostatnio: kzkzg, 2019-09-03 21:14
ostatni coś często się ten temat pojawia... btw zlinkowałeś do mojego komenta :P - WeiXiao 2019-09-03 21:33

Pozostało 580 znaków

2019-09-03 21:41
0

@kzkzg: Dzięki.

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

Pozostało 580 znaków

2019-09-03 21:42

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.

W kontrolerze nie mam żadnej logiki, to akurat wiem. Wszystko jest w serwisach pośredniczących. - Michalk001 2019-09-03 21:49
a te wszystkie ify i where? Dla mnie to już jakaś logika ( ͡° ͜ʖ ͡°) - AdamWox 2019-09-03 21:50
Są w serwisie. Kontroler tylko wywołuje serwis "Dane z tego przekazuje do modelu logiki, gdzie stworzyłem takiego potworka" być może troszkę nielogicznie to napisałem - Michalk001 2019-09-03 21:52
Wrzuciłeś to tak jakby "potworek" był w kontrolerze. Zwracam honor ;-) - AdamWox 2019-09-03 21:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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