[ virtualVoid @ 22.11.2009. 08:43 ] @
Najcesca situacija u kojoj se nadjem je c# sa mssql bazom koja je mapirana unutar 'linq to sql' fajla.
E sad, ja veoma rijetko kreiram tipove za tabele u bazi podataka (npr. imam tabelu korisnik, ali nemam klasu korisnik), nego sav upis vrsim preko funkcije unutar kontrolera (npr. DodajKorisnika(params), BrisiKorisnika(params),...).

Postoji li neko pravilo ili savjet kada i zasto kreirati tip na osnovu tabele iz baze podataka da bih preko njega pohranjivao podatke u tabeli?

Razlog za ovo pitanje je bio taj sto sam gledao tutorial za web servise i tamo sam vidio da tip ima tabelu npr. Korisnik sa 10tak redaka. On treba popuniti neki grid sa samo 3 podatka, pa je zato kreirao klasu (tip) Korisnik i dodao joj 2 privatna clana. Zatim je kreirao funkciju koja je preko linq-a izvlacila ta tri tipa i punila klasu Korisnik koja je onda bila source za gridview.
Zanima me zbog cega je ovo ovako radio jer ja uopce ne bih kreirao dodatni tip nego bih kreirao temp objekt tabele i u nju napunio trazene podatke pa onda stavio da je taj temp objekt source datagrid-a.

Nadam se da sam jasno postavio problem i da ne moram pisati primjer
[ mmix @ 22.11.2009. 11:13 ] @
Pa mislim da bi primer bio potreban :)

Cisto kako bi ti onda npr implementirao DajSveKorisnikeNaSlovo(char prvoSlovo)? Posto ovo vraca vise od jednog podatka ne mozes koristi ref i out, dakle treba ti neky Array ili List, a oni moraju da sadrze instance necega. To nesto je instanca klase o kojem pricamo. Sta ti koristis tu? Sta ti je temp objekat tabele?
[ virtualVoid @ 22.11.2009. 13:21 ] @
Mapiram bazu i pristupam joj preko 'static xxDataContext' objekta.
Preko linqa povucem sve sto mi treba
Code:
public List<TabelaA> GetSve()
{
return (from x in obj.TabelaA select x).ToList() 
//ili select new{x.a, x.b,...} a tada je povratni tip Object pa ga onda u kodu castam
}

i tu funkciju stavim kao source datagrid-a. I sve radi lijepo.

Medjutim, u ovom tutorialu su kreirali klasu TabelaA sa private clanovima string a, string b,... pa on onda "punili" tu glasu preko rezultata funkcije GetSve().

Radi ovoga sam pitao: "Kada raditi ovako kao ja, a kada praviti svoje tipove tabela". Mislim, select je puki odabir kolona, ne?! Sta tu treba praviti svoje tipove????
[ Shadowed @ 22.11.2009. 13:43 ] @
Pa, ako koristis Linq2SQL onda vec imas klase koje odgovaraju tabelama, samo ih nisi pravio rucno nego ti je alat sam obavio stvar.
[ virtualVoid @ 22.11.2009. 14:10 ] @
Hm, to sam i ja mislio . Znam da klase rade ljudi koji na 'stari' nacin pristupaju bazama, otvaraju i zatvaraju konekciju, itd.
Medjutim, ovaj tutorial je bio o tome kako u Silverlight app ucitati podatke iz linq2sql fajla. link je http://www.codeproject.com/KB/...ight/Silverlight3_SQL_WCF.aspx. Evo te recenice koja me zbunjuje:
Citat:
Just by looking at the Contact table above, you can tell there is a lot of information! There are a lot of columns, such as: ContactID, NameStyle, Title, etc. Since we only want the FirstName, LastName and EmailAddress columns, we will make a custom ContactRecord class to represent each contact row from the table, instead of using the exposed Contact type.

Posto ce selektirati samo odredjene kolone, on je i pored mapiranih tabela stvorio svoju vlastitu klasu. Zasto??????
[ Shadowed @ 22.11.2009. 14:17 ] @
Bez nekog detaljnijeg pregleda tutorijala, pretpostavljam da bi smanjio kolicinu podataka koje prenosi.
[ mmix @ 22.11.2009. 15:51 ] @
To sto rece shadowed (manje polja u select-u = manji SQL footprint) plus postoji razlika izmedju

from x in obj.TabelaA select new{x.a, x.b, ..}
i
from x in obj.TabelaA select new PodTabelaA(x.a, x.b,...)

a to je typing.

List<PodTabelaA> mozes da vratis van metoda za ucitavanje i onda mozes da ih konzumiras bez refleksije. Ne znam o kakvog castingu iz List<Object> si pricao, ali tip generisan kroz new{x.a, x.b, ..} tebi nije dostupan jer se dinamicki generise pri kompajliranju sa kripticnim imenom tako da ne mozes ni da znas u koji tip treba da castujes object.
[ Shadowed @ 22.11.2009. 16:00 ] @
Doduse, ja sam vise mislio na kolicinu podataka do klijenta, posto se radi o Silverlight-u i WCF-u.
[ virtualVoid @ 22.11.2009. 16:12 ] @
Citat:
Shadowed: Doduse, ja sam vise mislio na kolicinu podataka do klijenta, posto se radi o Silverlight-u i WCF-u.

je li ovo bas do silverlighta (ako jeste molim te pojasni) ili si mislio da je to zbog toga sto se radi o web servisu pa da se sto manje podataka prenosi preko net-a, odnosno da se trazeni objekt sto prije prenese?

Citat:
mmix: To sto rece shadowed (manje polja u select-u = manji SQL footprint) plus postoji razlika izmedju

from x in obj.TabelaA select new{x.a, x.b, ..}
i
from x in obj.TabelaA select new PodTabelaA(x.a, x.b,...)

a to je typing.

List<PodTabelaA> mozes da vratis van metoda za ucitavanje i onda mozes da ih konzumiras bez refleksije. Ne znam o kakvog castingu iz List<Object> si pricao, ali tip generisan kroz new{x.a, x.b, ..} tebi nije dostupan jer se dinamicki generise pri kompajliranju sa kripticnim imenom tako da ne mozes ni da znas u koji tip treba da castujes object.


Hmmmm malo si me zbunio a ne mogu sada kopati po projektima , ali koliko se sjecam ja sam pravio funkcije (mvc arhitektura, sloj kontroler) na nacin
Code:
public Object GetNesto(){
      var query = (from x in y.TabelaA select new {x.id, x.ime,...});
      return query;
}

pa bih onda kasnije u GUI sloju ovaj Object castao u tip koji je meni trebao (jer sam znao sto ovaj OBject sadrzi u sebi, odnosno u koji tip ga mogu bezjedno castati). Mislis da je ovo pogresno te da cu na ovaj nacin ubuduce napraviti runtime bug koji ce mi zivot popiti?
[ mmix @ 22.11.2009. 16:48 ] @
Citat:
virtualVoid: pa bih onda kasnije u GUI sloju ovaj Object castao u tip koji je meni trebao (jer sam znao sto ovaj OBject sadrzi u sebi, odnosno u koji tip ga mogu bezjedno castati). Mislis da je ovo pogresno te da cu na ovaj nacin ubuduce napraviti runtime bug koji ce mi zivot popiti?


A koji je to tip ;) Implicitno generaisani LINQ tipovi su uvek proste strukture i nasledjuju samo Object, tako da mozes da ga castujes samo u object (sto radis) ili u njega samog (sto ne morzes da radis).

Prekopaj po projektima pa ces videti. Jedni nacin da iz takove object instance izvuces polje je refleksija (ako znas da ima polje a onda iz typeof(instance) izvucez fielddescriptor i preko njega izvuces vrednost polja).

shadowed, to sam i mislio pod footprintom, velicina result seta.
[ Shadowed @ 22.11.2009. 17:19 ] @
Citat:
virtualVoid: je li ovo bas do silverlighta (ako jeste molim te pojasni) ili si mislio da je to zbog toga sto se radi o web servisu pa da se sto manje podataka prenosi preko net-a, odnosno da se trazeni objekt sto prije prenese?


Nije do Silverlight-a, vec jednostavno, svaki podatak koji se prenosi od servisa do klijenta se serijalizuje a ako imas vise property-a u klasi i serializovani rezultat ce biti veci pa pravis nepotreban protok.
[ mmix @ 22.11.2009. 17:31 ] @
Citat:
virtualVoid:
Code:
public Object GetNesto(){
      var query = (from x in y.TabelaA select new {x.id, x.ime,...});
      return query;
}

pa bih onda kasnije u GUI sloju ovaj Object castao u tip koji je meni trebao (jer sam znao sto ovaj OBject sadrzi u sebi, odnosno u koji tip ga mogu bezjedno castati). Mislis da je ovo pogresno te da cu na ovaj nacin ubuduce napraviti runtime bug koji ce mi zivot popiti?



Aaaa, cek, cek, sad ja vidim sta ti radis. Ti ne vracas podatke iz baze u Object, ti bukvalno vracas Queryable<T> Linq2SQL objekat. Bar je tako u ovom primeru koji si dao. Problem je sto se konkretan poziv SQL serveru desava pri evaluaciji Queryable<T> objekta, ne pri njegovoj deklaraciji, sto znaci da si ti pozivao SQL server iz GUI layera, sto je za pocetak konceptualno pogresno. decoupling + var = big trouble kad se ne pazi