Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko linq upita

[es] :: .NET :: .NET Desktop razvoj :: Pomoc oko linq upita

[ Pregleda: 2562 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Pomoc oko linq upita20.12.2010. u 07:17 - pre 161 meseci
U pitanju je linq to sql.
Imam dve tabele.
Master i detail.
Potrebno je da prikazem sve master tabele sa svim detail stavkama u kojima je ispunjen uslov da je tip = 10

var a = from t in dc.Masters
where t.Details.Tip == 10
select t;

ovaj upit mi vraca nazad sve master slogove gde je tip njihovih detalja = 10. Meni bi trebalo da radi drugacije, da mi vrati samo ona zaglavlja kod kojih je makar jedan detalj tipa 10. Ako postoji makar jedan tipa 10 onda mi vrati sve stavke od tog zaglavlja (ne samo tipa 10).
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 07:34 - pre 161 meseci
Pretpostavljam da mogu ovako da uradim:

var a = from t in dc.Masters
inner join s in dc.Masters on s.id = t.id
where t.Details.tip == 10
select s;

ovde bi trebalo da dobijem sve master i njegove stavke.
da li ima neko drugu ideju?
 
Odgovor na temu

lukeguy
Novi Sad

Član broj: 46545
Poruke: 470
212.200.231.*



+8 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 09:15 - pre 161 meseci
napamet pišem:

var a = dc.Masters.Where(m => m.Details.Any(d => d.Tip==10));

ovo bi trebalo da vrati sve mastere čiji bar jedan detalj ima tip 10. eventualno dodaj na kraj ToList() ili ToArray() u zavisnosti koja ti kolekcija treba.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 09:20 - pre 161 meseci
treba da razmisljas objektno pre nego kao SQL programer

Dakle "za detalje koji su tip 10 vrati mi mastere"

Code (csharp):

from d in dc.Details
where d.tip == 10
select d.Master
 


Ako hoces da ti se u isto vreme uz mastere vrate i svi detalji ubaci load option u context.

Code (csharp):

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Master>(m => m.Details);
dc.LoadOptions = dlo;
 



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 09:56 - pre 161 meseci
Sa apsekta performansi, kakve su razlike izmedju mog upita i ovog tvog?
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 10:06 - pre 161 meseci
Da li mozes da mi objasnis sta radi ovaj drugi kod?
Onaj prvi vraca mastere i details-e (samo details koji su tipa 10).
Ako sam dobro shvatio drugi kod prolazi kroz te mastere (koji su napunjeni u datacontext-u) i sa loadwith popunjava sve details-e za svakog mastera?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 10:08 - pre 161 meseci
Upit bi trebalo da je isti, samo je linq kod pregledniji. subquery za detalje bi isto trebao da bude identican onda. Po meni je bolje da radis preko relacija koje su nasledjene iz SQL tabele pre nego sto pravis svoje asocijacije u query-u, jer ako promenis referentni integritet na bazi i rebildujes model moj query ce i dalje raditi a tvoj ce postati bagovit/nekompletan.

Code (sql):

SELECT [t1].[polje1], ....
FROM [Details] AS [t0]
INNER JOIN [Master] AS [t1] ON [t1].[ID] = [t0].[ID]
WHERE [t0].[tip] = @p0, @po = 10;
 


I ne, prvi kod ne vraca detalje, jedan LINQ query moze da ti vrati samo jedan tip objekta (ima samo jedno T u IQueryable<T> ) u suprotnom moras da radis projektciju (sto ovde nije neophodno). Drug kod samo kaze L2Su "kad ucits mastere, odmah ucitaj i sve njihove detalje da ne cekamo lazy-load. Prednost je sto ce samo jedan SQL statement popuniti sve detalje umesto da L2S az svaki master daje po jedan SQL on-demand (sto bi se npr desil o da te mastere ubacis u neki hijerarhijski grid ili cupas details u foreach petlji)
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 10:27 - pre 161 meseci
I da, zaboravih da ti napomenem, moj query (a i tvoj sa join) vraca duplikate, tj ako ima tri detalja sa tip 10 vratice ti tri identicna mastera, moras da stavis Distinct() na kraju.


Code (csharp):

var x = (from d in dc.Details
where d.tip == 10
select d.Master).Distinct();

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 11:08 - pre 161 meseci
U mom slucaju odgovara mi lazy load.
Posto podatke prikazujem u dva grida i tek kada se selektuje slog u masteru treba da se ucitaju podaci za details.
Mene zbunjuje sledece: da li sa ovim upitom dobijam full napunjenu Details relaciju od tabele Master? (npr. kada idem Masters.Details da li cu dobiti sve detalje ili samo one koji su tipa 10?)

var x = (from d in dc.Details
where d.tip == 10
select d.Master).Distinct();

Ako sam te dobro shvatio, ovaj upit bi trebalo da vraca nazad sve masters-e.
A kada bi se setalo po gridu u masters-u na svako pozicioniranje sloga napunilo bi se komplet details za drugi grid.
Taj drugi grid za prikaz koristi subset Details od bindingsource-a prvog grida.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 11:16 - pre 161 meseci
Details bi se napunio onog trenutka kad neko referencira instance(Master).Details property. U tom trenutku L2S ce da provali da ta lista nije popunjena i izdace SQL statement u okviru konteksta da popuni SVE detalje tog specificnog mastera (ne samo one koji su tip 10) tj "from s in Details where s.masterid = tajmaster.id select s"

lazy load moze da ti odgovara samo ako je grid takav da ne ucitava odmah child liste (npr hijerarhijski grid kojem su top level redovu collapsed). Jer ako grid uzme pa otvori sve mastere ili kesira podatke tako sto ucita ceo data model u sebe (ne znam koji grid koristis) onda ti je preload bolje resenje.



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 11:43 - pre 161 meseci
Koristim xtragrid (devexpress).
Nije mi jasno sledece: ovim tvojim upitom ce mi se automatski popuniti i details, zato sto sam u uslovu rekao da je tip = 10.
Znaci, upit ce mi uzeti distinct masters-a a details ce biti popunjenje sa onim uslovom iz upita.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 11:59 - pre 161 meseci
Nisi razumeo.

LINQ upit ce da vrati SAMO mastere. A svaki master ce imati property Details koji je u stvari proxy za lazy-load. Lazy-load ucitavanje detalja nema nikakve veze sa inicijalnim LINQ querijem, jednostavno se ucitavaju SVI child elementi koji zadovoljavaju relaciju (sto je ono sto tebi treba). Da limitiras koje redove vraca lazy-load koristi se druga forma load opcija:

Code (csharp):

DataLoadOptions dlo = new DataLoadOptions();
dlo.AssociateWith<Master>(m => m.Details.Where(d => d.tip == 11));
dc.LoadOptions = dlo;
 


Ovo bi npr u lazy-load vratilo samo detalje koji imaju tip 11. U kombinaciji sa onim LINQ querijem to bi znacilo "za detalje tipa 10 vrati sve mastere i posle samo njihove detalje tipa 11". Uostalom isprobaj upite pa vidi kako se ponasaju, bice ti jasnije.




Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

MatezYU

Član broj: 4114
Poruke: 1586
*.otpbanka.rs.



+17 Profil

icon Re: Pomoc oko linq upita20.12.2010. u 12:09 - pre 161 meseci
Kapiram.
Sad sam shvatio kako radi :)
Hvala ti puno!
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Pomoc oko linq upita

[ Pregleda: 2562 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.