[ Neznalica_sa_ugla @ 08.01.2013. 19:23 ] @
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
[ aca andrijevic @ 08.01.2013. 19:34 ] @
Pitanje samo jedno:pod kojom bazom ti je web aplikacija?
[ Dejan Carić @ 09.01.2013. 09:37 ] @
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:
Code:
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();


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)
[ Shadowed @ 09.01.2013. 10:57 ] @
Pa, skip je mogao da uradi u prvoj liniji pre take (prvi kod).
[ Dejan Carić @ 09.01.2013. 11:38 ] @
@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.