Wpis z mikrobloga

#csharp #aspnet #api #rest

Witajcie wykopki

Nie oczekuję kodu. A raczej podpowiedzi, naprowadzenia.
Słuchajcie muszę zrobić akcję do przeszukiwania bazy danych.
Szukać można za pomocą 4 kryteriów.
jakieś znaki
data rozpoczęcia
data zakończenia
rodzaj usera

I każdy z nich jest opcjonalny(oczywiście 2 i 3 muszą występować razem). Oczywiście wyszukiwania nie mogą się powtarzać itd. itp.

I tu jest problem.
Zacząlem robić tak, że po kolei sprawdzam każdą zmienną czy nie jest nullem. Pobieram wartości pasujące do wyszukiwanej frazy i tu się zaczynają schody.
Bo User jest w relacji jeden do wielu względem rodzaju usera. Tu robi mi się pełno pętel sprawdzania i mnóóóóóstwo kodu. Jestem pewny, że już się z takim czymś spotkaliście i wiecie jak to zoptymalizować.

Pozdrawiam!
  • 11
  • Odpowiedz
@Phoryn: jakiego ORM używasz? jak w ogóle zapytania kreujesz? proponuje poćwiczyc proste zapytania SQL, od tego będzie potem łatwiej wyjść. W ogóle zaczałbym od klasyczne ADO.NET ze składowanymi procedurami.
  • Odpowiedz
@Phoryn: albo dawaj sampla albo usun konto. Kazdy ma w glowie inna architekture tego twojego tałatajstwa i mamy slyszec w odpowoedzi: "no tak ale u mnie by nie zadzialalo bo mam jeszcze x i y" :P
  • Odpowiedz
@MaGajwer: ORM to Entity. Zapytania kieruję przez linq. mam coś takiego:

_context.Roles.Include(q => q.users).Where(f => f.users.Any(e => e.FirstName.ToUpper().Contains(search.Keyword.ToUpper()))).ToList()
@nietrolluje: Dzięki.
  • Odpowiedz
@Phoryn: ciężko powiedzieć, ta linijka może być poprawna i nie ( ͡° ͜ʖ ͡°)

Od razu mówię, że z EF dużo nie działałem, ale ten Twój .Where nie powinien być wewnątrz Include? Albo chociaz jakiś join między Roles a Users? Przypuszczam.
  • Odpowiedz
@Phoryn: DateTime jest strukturą, więc nie może być nullem, ale jej wartość domyślna to DateTime.MinValue, więc możesz zrobić tak:

(from == DateTime.MinValue || to == DateTime.MinValue) || (q.Date >= from && q.Date <= to)
- Zwróci Ci wyszystkie wyniki jak gdy podasz from lub to, w przeciwnym wypadku tylko z podanego zakresu

string.IsNullOrWhiteSpace(name)
  • Odpowiedz
@MaGajwer: @LoganWhyz:
Dobra Panowie. W końcu przesiedziałem nad tym swoim kodem i jak zwykle oczy mi się otworzyły. Próbowaliście mi napisać, że najprostsze rozwiązanie ale... wiecie jak jest wystarczyło to

_context.Users.Include(q => q.roles)
.Where(
  • Odpowiedz