Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Klekner
Člen
Avatar
Petr Klekner:5.9.2018 22:10

Zdravím mám následující problém. Programuji v .net mvc a používám EF. Mám tabulku Category(ID, Name, ID_Parent) a tabulku Good(ID, Name, ID_Category) - tabulky jsou zjednodušené. A můj dotaz je následující. Řekněme že mám tyto kategorie - berte v potaz že je to rodič a podkategorie
Kolo(ID = 1, ID_Parent = NULL)
Horské kolo (ID = 2, ID_Parent = 1)
Brzdy (ID = 3, ID_Parent = 2)
Silniční kolo (ID = 4, ID_Parent = 1)

Tak a nyní si například vyberu kategorii Horské kolo a chci, aby se mi zobrazilo zboží jak horská kola tak i brzdy. Mám to ted nyní udělané přes rekurzi a funguje to. Ale nevím zda je to tak dobré mít. Víceméne potřebuji vytáhnout všechny podkategorie a vzít si jejich zboží. Není na to něco jiného? Něco jako treeview nebo něco podobného? Předem Vám moc děkuji za info.

Zkusil jsem: Vytvořit podle rekurze, což se povedlo, ale nemyslím si, že je to efektivní.

Chci docílit: Vytvoření dobré funkčnosti.

 
Odpovědět
5.9.2018 22:10
Avatar
Roman
Člen
Avatar
Roman:6.9.2018 9:41

Doporucuju se kouknout na LINQ tady na webu https://stackoverflow.com/…ession-query

 
Nahoru Odpovědět
6.9.2018 9:41
Avatar
Petr Klekner
Člen
Avatar
Petr Klekner:6.9.2018 10:48

Děkuji z opověď. LINQ samozřejmě znám a je fakt že tady by se dal použít. Ale přesně nevím jak... Mohl by si mi prosím jenom napsat, jak třeba by si to udělal.

 
Nahoru Odpovědět
6.9.2018 10:48
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6.9.2018 15:53

Nevim, zda tohle pujde jednoduse filtrovat. Uvazuji o sql dotazu.
Ja bych to udelal tak, ze ty komentare jsou komentare k nejakemu prispevku, meli by mit id_prispevku. A dale id_komentare na ktery clovek reaguje. Pak se podle id_prispevku daji ziskat vsechny komentare k tomu prispevku. Cili, v sql bych si nejdriv pridal jeste sloupec s id_prispevek.
Ale, ty to resis asi jinak nez na urovni sql. To jen takovy napad.

Resp, ty resis sktruturu kategorii, to je podobne.
Tam bych si mozna stanovil, ze muze mit strom max 6 vetsi a pro kazdou vetev pridal sloupecek s id. Neni to moc usporne, ale zas nemusis resit rekurzivni dotazy.

Editováno 6.9.2018 15:55
 
Nahoru Odpovědět
6.9.2018 15:53
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Petr Klekner
Martin Petrovaj:6.9.2018 17:39

Osobne si myslím, že ak nemáš niekoľko stotisíc kategórií, tak je v tomto prípade rekurzívne riešenie v pohode akceptovateľné :-)

Ak by si chcel použiť algoritmus s nejakou nižšou zložitosťou, tak by si musel spraviť medzikrok v podobe vytiahnutia dát z databázy do svojho programu a tam ich spracovať svojím algoritmom v C#. Pamätaj ale na to, že SQL databázy sú dnes už špičkovo odladené a sotva môžeš dúfať, že by si sa im v rýchlosti spracovania dát vyrovnal ;-) Nehovoriac o tom, že by si pravdepodobne prenášal dosť veľký objem dát z databázy, čo zamená kopu ďalších z toho vyplývajúcich problémov.

Pokiaľ by si si bol niekedy v živote na 1 000 000% istý, že poznáš / potrebuješ spracovať dáta nejakým špecifickým spôsobom, nevieš alebo sa ten algoritmus nedá efektívne zapísať pomocou SQL a benchmarkom a profilovaním si potvrdil, že tvoj spôsob spracovania v C# je určite výhodnejší, tak by som aspoň prichádzajúce dáta na strane databázy prefiltroval a usporiadal, pokiaľ sa len dá a až potom si ich ťahal k sebe a spracovával ich ďalej. Samozrejmosťou je aj optimalizácia na strane databázy, to znamená minimálne teda zavedenie databázových indexov tam, kde sú potrebné, optimalizácia samotných SQL queries, možno zmena štruktúry tabuľky (tabuliek) atď.

Entity Framework + LINQ ani iné ORM nástroje ešte dlho nebudú vedieť zostaviť perfektné (alebo aspoň efektívne) queries, ale aj tak nám dnes akosi stačia a ako sa hovorí, "premature optimization is the root of all evil" :-) Inak povedané, pokiaľ ti tento konkrétny problém nespôsobuje už teraz závažné problémy s výkonom, až tak by som sa o to nestaral. Ak áno, tak naozaj poriadne a vo všetkých aspektoch.

Nahoru Odpovědět
6.9.2018 17:39
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Martin Petrovaj
Petr Klekner:7.9.2018 10:33

Moc děkuji za odpovědi. Jak píše Peter Mlich také mě napadlo si sestavit SQL dotaz, našel jsem na internetu příklad, kde je také rekurze, ale tak zase by se to o něco zrychlilo a mohl bych to načítat například přes Dapper a ne přes EF, abych docílil ještě větší rychlosti. Jinak tvůj nápad je zajímavý, ale to se mi dělat nechce...

Martin Petrovaj děkuji za super vysvětlení. :) Samozřejmě máš pravdu pokud nebudu mít stotisíc kategorií, tak to nebude nic strašně pomalýho. Zase mě napadlo, že si přece jenom můžu vždy vzít například jenom prvních 5 prvků a pokud se klikne na další stránku tak pokračovat skipnout 5 a vzít dalších 5 atd. Což by mělo tu rychlost zlepšit. Ale stejně se zeptám jestli si třeba myslíš, že je dobrý nápad napsat si SQL skript a pomocí dappru vrátit co myslíš?

 
Nahoru Odpovědět
7.9.2018 10:33
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Petr Klekner
Martin Petrovaj:7.9.2018 12:30

Ako nápad na zrýchlenie aplikácie to vôbec nie je zlé. Napíš si nejakú SQL procedúru, ktorá ti bude vracať tieto stránkované výsledky, dapperom to jednoducho a rýchlo vytiahneš… why not.

Len si zisti, ako sa robí v tebou používanom SQL to stránkovanie (v MS SQL sa najčastejšie používa offset a fetch [1 ], prípadne ak potrebuješ viac kontroly tak priamo kurzor). U ostatných databáz ale úprimne neviem. A nezabudni to poriadne otestovať pre všetky možné situácie a prípady, stačí drobná chyba a začnú sa diať divy ;-)

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět
7.9.2018 12:30
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Petr Klekner
Člen
Avatar
Odpovídá na Martin Petrovaj
Petr Klekner:8.9.2018 10:51

Moc ti děkuji. :) Jojo dělám v MsSql kouknu na to. Ještě jednou všem děkuji.

 
Nahoru Odpovědět
8.9.2018 10:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.