Nakon malog razmišljanja , mislim da je ipak mjesto ovome pitanju ovdje ne u bazama,jer ovo treba rješiti programski ne na upitu. Nami imam stranicu http://geocomerce-nekretnine.hr . Klikom na botun "prikaži" prikaže sve objekte koji su dosada unešeni . ( Slična stvar i sa Galerijom ,al da jedno pratimo) Ovo je odrađeno onako , kako kaže profesija, ali ja uvjek želim više. Recim da će u nekom budućem trenutku biti par desetaka hiljda (???) objekata (rekao sam recimo). i kako ja odjednom prikazujem samo k-objekata(12) i onda listam kao stranice . Problem je u tome što ja ne želim iz baze uzimati sve nego samo 1-12 sa (1 stranicu) (13-24 - 2 stranica ) ( 25-36 - 3 stranica ).... i tako redom .Primjetite da lijevo postoji izbornik , po mjestu,lokaciji ,tipu objekta ,povšini i cjeni , znači ja unaprijed ne znam broj objekata koje treba prikazati , nego iz baze napunim listi , pa i prikazujem . Nodostatak je u tome , što i kada trebam prikazati (recimo 25-36 samo 12 , ja punim cijelu listu , što želim izbjeći . Kakav vi ovdje imate pristup . Saslušaću svaki savjet . Hvala
Kako izdvojiti samo neke zapise iz baze
Zaključano
Zakačeno
Pitanje samo jedno:pod kojom bazom ti je web aplikacija?
Potpis
"Ne menjaj nesto sto te sasvim dobro sluzi, ne trazi leba preko pogace" - Aleksandar Andrijevic
Ajde da kažemo da će u jednom trenutku biti milion objekata ili 10 miliona, a ne samo 10 hiljada :)
Iz kog razloga želiš da prikažeš sve objekte? Osim ako ne želiš da dozvoliš nekome da pokupi sve podatke iz tvoje baze...
Možeš da limitiraš pretragu na 500 rezultata i onda ti je lako da napraviš paginaciju:
500 objekata nije mnogo da učitaš u memoriju i sa njima možeš lako da odradiš Skip() i Take().
Ukoliko baš hoćeš da prikažeš sve podatke onda je nezgodno da ih sve učitaš u memoriju već moraš da kreiraš 2 upita. Sa jednim ćeš dohvatiti ukupan broj rezultata koji zadovoljavaju uslov pretrage, a sa drugim ćeš dohvatiti samo set podataka:
Kada radiš pretragu sa velikim setom podataka, onda je zgodno da koristiš biblioteke koje su upravo tome namenjene:
- Lucene.NET ukoliko ti treba embedded rešenje koje zahteva samo .NET framework
- Solr.NET ukoliko ti treba više enterprise rešenje (zahteva Javu)
Iz kog razloga želiš da prikažeš sve objekte? Osim ako ne želiš da dozvoliš nekome da pokupi sve podatke iz tvoje baze...
Možeš da limitiraš pretragu na 500 rezultata i onda ti je lako da napraviš paginaciju:
Code:
var list = (from x in .... where ....).Take(500).ToList();
var list = (from x in .... where ....).Take(500).ToList();
500 objekata nije mnogo da učitaš u memoriju i sa njima možeš lako da odradiš Skip() i Take().
Ukoliko baš hoćeš da prikažeš sve podatke onda je nezgodno da ih sve učitaš u memoriju već moraš da kreiraš 2 upita. Sa jednim ćeš dohvatiti ukupan broj rezultata koji zadovoljavaju uslov pretrage, a sa drugim ćeš dohvatiti samo set podataka:
Code:
var count = (from x in .... where ....).Count();
...
var list = (from x in .... where ....).Skip(...).Take(...).ToList();
var count = (from x in .... where ....).Count();
...
var list = (from x in .... where ....).Skip(...).Take(...).ToList();
Kada radiš pretragu sa velikim setom podataka, onda je zgodno da koristiš biblioteke koje su upravo tome namenjene:
- Lucene.NET ukoliko ti treba embedded rešenje koje zahteva samo .NET framework
- Solr.NET ukoliko ti treba više enterprise rešenje (zahteva Javu)
Pa, skip je mogao da uradi u prvoj liniji pre take (prvi kod).
@Shadowed,
Možda nisam bio dovoljno jasan kod prvog primera :(
Da bi napravio paginaciju, mora da zna broj objekata koje treba da prikaže (mora da izvrši Count naredbu / upit), kao i da izvši upit za prikazivanje podataka na jednoj stranici (skip i take).
Ukoliko se radi o složenijem upitu sa mnogo podataka u bazi, izvršavanje jednog upita može trajati 2,3,4 sekunde...
Ako je potrebno 3 sekunde da se izvrši Count i isto toliko vremena da se izvrši upit sa Skip / Take, to je ukupno 6 sekundi. Ne znam da li baza ovde može da izvrši neku drastičnu optimizaciju i ubrza drugi upit na osnovu prvog. Ako u startu odradi Take(500), uštedeo je 3 sekunde za Count() i samim tim će učitavanje stranice trajati približno 3 sekunde kraće.
Možda nisam bio dovoljno jasan kod prvog primera :(
Da bi napravio paginaciju, mora da zna broj objekata koje treba da prikaže (mora da izvrši Count naredbu / upit), kao i da izvši upit za prikazivanje podataka na jednoj stranici (skip i take).
Ukoliko se radi o složenijem upitu sa mnogo podataka u bazi, izvršavanje jednog upita može trajati 2,3,4 sekunde...
Ako je potrebno 3 sekunde da se izvrši Count i isto toliko vremena da se izvrši upit sa Skip / Take, to je ukupno 6 sekundi. Ne znam da li baza ovde može da izvrši neku drastičnu optimizaciju i ubrza drugi upit na osnovu prvog. Ako u startu odradi Take(500), uštedeo je 3 sekunde za Count() i samim tim će učitavanje stranice trajati približno 3 sekunde kraće.