piątek, 31 sierpnia 2018

Nowy filtr część 2 - testy, konkluzja

Test.

w parametrze umieszczone dwa słowa oddzielone spacją (ciekawe czy przecinek był by lepszy?)
Po stronie bazy sprawdziłem na którym dystansie jest najwięcej wpisów

 "Managment SQL"
select count(dys_id) as ilosc, dys_id from kartoteka2
group by dys_id
order by ilosc desc
Dystans 600 oblegany najbardziej.

Parametr param1 = "100"
Nie stało się nic odkrywczego obie funkcje zwracają taką samą ilość rekordów  = 24. Można było się tego spodziewać.
Parametr param1 = "Zbigniew 100"
Funkcja pierwsza nic nie zwróciła druga 24 rekordy.
Parametr param1 = "100 Brak"
Funkcja pierwsza nic nie zwróciła druga 55 rekordów.
Parametr param1 = "Brak 100"
Funkcja pierwsza zwróciła 24 rekordy druga 55 rekordów.

Dlaczego pierwsza zwróciła 24 rekordy w ostatnim przypadku gdyż zapis danych do kolumny dane
jest w kolejności imię, nazwisko,grupa,dystans,rezerwa,oplacony.
Druga funkcja zwróciła 55 rekordów z powodu budowy zapytania pytam za każdym razem cały zbiór inną wartością parametru param1 gdyż rozbijam go na listę.

Uwaga.
  • Nazwy funkcji są nie znaczące nazwy zmienić trzeba.
  • przed wyszukiwanie uppercase trzeba dać, albo przed zapisem do bazy uppercase na imię, nazwisko, email, grupa.
W kodzie znajdzie się funkcja nr dwa, uprości to nieco paginga w MVC.

Kilka dni temu zauważyłem niepokojące wyniki, zdarza się że filtr zwraca dane, które nie powinny się tam znaleźć albo znajdują się z nie wyjaśnionych przyczyn.
Chciałem wyszukać ludzi jadących na 150 km wartość wpisana "150".
Otrzymałem takie dane:

Nie zgadzał mi się pierwszy rekord dlaczego tam jest dystans 100 km przecież szukam 150.
Robimy inwestigejszyn.

Myślałem że znajdę zapytanie za pomocą SQL Server Profiler ale się nie udało, wydaje mi się (aczkolwiek nie wiem czy dobrze myślę), że ostatnią część filtra czyli porównanie list robię nie na bazie bezpośrednio a na wcześniej zaciągniętych danych.
Nie włączyłem Lazy Lołding, więc jest opcja ta druga.

var tabParam = param1.Split(' ').ToList();

tabParam = tabParam.Where(x => !string.IsNullOrWhiteSpace(x))
.Distinct().ToList();
oneColumn = oneColumn.Where(x => tabParam.Any(y => x.dane.Contains(y)));
                  
result = result.Where(x => oneColumn.
Any(y => y.imie == x.imie && y.nazwisko == x.nazwisko)).ToList();

W wykryciu co się dzieje w środku pomógł mi LinqPad (wersja darmowa).
Kod musiałem trochę dostosować do LinqPad-a

1. string tab = "150 ";
2. List<string> result = tab.Split(' ').ToList();
3. result = result.Where(x => !string.IsNullOrWhiteSpace(x)).Distinct().ToList();
4. List<VOneColumn> oneColumn = VOneColumn.ToList();
5. oneColumn = oneColumn.Where((x => result.Any(y => x.Dane.Contains(y)))).ToList();
6. //oneColumn.Dump();
7. List<VmodelExt> lista = VmodelExt.ToList();
8. lista = lista.Where( x => oneColumn.Any(y => y.Imie == x.Kart_imie && y.Nazwisko == 
9. x.Kart_nazwisko)).ToList();
10. lista.Dump(); //--> zwrocenie rezultatu na ekran

 Wyniki dały do myślenia, po pierwszym zapytaniu linia numer 5, otrzymałem dane zawodników jadących na 150 km, wyniki tej listy służą do wyszukania danych w kolejnym zbiorze linia nr 8 i 9, tu  otrzymałem dodatkowe cztery rekordy.
Dlaczego?
Odpowiedz jest już na powyższym obrazku w ostatnim widocznym wierszu mamy tego samego człowieka na dystansie 150 km. Żeby dokładnie przejrzeć wyniki trzeba było sięgnąć do Managmenta rezultat nie był zaskoczeniem.
Jest dwóch zawodników te same imię i nazwisko ale inny adres email (nie prezentuje go na liście zawodników), tabela ma postawioną unikalność imię, nazwisko i adres email. Więc w tym wypadku unikalność jest zachowana, a wynik poprawny.

Zastanawiam się nad skutecznością tych filtrów czy lepiej jedno pole czy wybierać z kilku tak jak było na początku? (to tak trochę po za tematem)

Jeszcze jedna uwaga.
Do testów w LinqPad stworzyłem sobie dwa widoki gdyż miałem problem z dołożeniem (poprawnym działaniem) referencji do moich bibliotek.

Brak komentarzy:

Prześlij komentarz

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...