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

Linq problem - kako spojiti upit...

[es] :: .NET :: ASP.NET :: Linq problem - kako spojiti upit...

Strane: 1 2

[ Pregleda: 7605 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Linq problem - kako spojiti upit...26.12.2014. u 22:02 - pre 113 meseci
Rezultat GroupBy nisu kolone. Prva stvar koju moras da razlucis je da LINQ ne koristi flat model kao sto to radi SQL, koristi objektni model, rezultat svih operaciju nisu redovi sa kolonama vec liste objekata, gde se samo finalni objekti mogu posmatrati kao flat liste polja/kolona (mada ni to nije tacno jer svaka "kolona" moze biti bilo sta, objeakt ili cak nova lista). Samim tim rezultat group by operacije je lista (IOrderedQueryable) group objekata (IGrouping) koji poseduju kljuc (int32) i listu polaznih objekata (Ticket) za specificnu vrednost kljuca, npr:



Ako hoces da lista ticketa unutar grupe bude sortirana, onda primenis sort na listu od koje se gradi grupa (na queryX), jer su sve iterativne LINQ operacije, kao sto je groupby, linearne (idu od pocetka seta ka kraju)


Btw, ako te interesuje kako sam dobio gornju sliku, google LinqPad i skini ga, koristice ti.
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ć
Prikačeni fajlovi
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Linq problem - kako spojiti upit...26.12.2014. u 22:26 - pre 113 meseci
Drugi savet koji imam da ti dam je da ne preterujes mnogo Trebalo bi da gledas kako da minimizujes broj upita u bazu, to je nesto sto mnogo ljudi zaboravi koristeci LINQ. Gornji kod, i moj i tvoj, ce izazvaati vise upita u bazu u zavisnosti od toga koje grupisanje se koristi. Mnogo bolja opcija bi ti bila (posto ionako skidas sve aktivne tikete), da ih sve ucitas u listu (resolvujes iz Linq2SQL/EF u cisti Linq) i da onda manipulises u lokalnoj memoriji. Ovaj kod bi onda bio:

Code (csharp):

     var queryX = from a in baza_kon.Tickets
                          where a.Aktivan == 1
                          select a;

     Expression<Func<Ticket, bool>> statusFilter = a => true;
     if (!String.IsNullOrEmpty(status)) statusFilter = a => a.StatusTiketa.NazivStatusa == status;

     var listX = queryX.Where(statusFilter).ToList();
     listX.Dump();
     
     ViewBag.grupisi = "0";
     Func<Ticket, int> groupFilter = a => a.Id_tiket;
     if (!String.IsNullOrEmpty(Grupisi))
     {
        ViewBag.grupisi = "1";
          if (Grupisi == "ms.NazivGrada") groupFilter = a => a.Id_mesto;
          if (Grupisi == "vr.NazivVrsteRada") groupFilter = a => a.Id_vrste_rada;
     }
     
     var keyEmplist = listX.GroupBy(groupFilter).OrderBy(a => a.Key);
 


Primeti par razlika:
- uveli smo listX, on vise nije IQueryable<Ticket> vec List<Ticket> zbog ToList()
- kad pozovemo to ToList(), Linq query se izvrsi na DB serveru i dobijamo podatke u memoriji
- posto vise Linq2SQL/EF ne mora da prevodi query u SQL, nema potrebe ni da koristimo Expression<Func<>> delegat, dovoljno je da koristimo Func<> jer ce se delegat izvrsaavti u lokalnoj memoriji nad lokalnim podacima.
- posto je foreign key isti u tickets i u parent objektima, vrse ne radimo grouping po parent objektu da bi izbegli call-back u bazu
- rezultat sada vise nije IOrderedQueryable, vec IOrderedEnumerable, ali sa funkcionalnog stanovista oni su identicni za tvoju upotrebu:




PS: Otvorio sam jednu vrednost u jednom polju, cisto da vidis da "kolona" u stvari nije jednostavan tip, vec drugi objekat.


[Ovu poruku je menjao mmix dana 26.12.2014. u 23:46 GMT+1]
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ć
Prikačeni fajlovi
 
Odgovor na temu

patak_daca

Član broj: 72199
Poruke: 418
*.dynamic.sbb.rs.



+1 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 07:51 - pre 113 meseci
mmix hvala ti puno !!! Ovo što si napisao je zapravo uputsvto kako raditi sa LInq.
Ovo će svakome da koristi ko se time bavi.
Potrudiću se da sve to razumem i primenim u rešavanju problema..
Poz
 
Odgovor na temu

patak_daca

Član broj: 72199
Poruke: 418
*.dynamic.sbb.rs.



+1 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 08:32 - pre 113 meseci
Kada primenim ovaj kod u LinaPad-u

from a in Tikets
orderby a.StatusTiketas.NazivStatusa descending
group a by a.Gradovis.NazivGrada into newGroup
select newGroup

radi upravo ovo što hoću..sortira mi grupu po NazivuStatusa

ali kada primenim na code u C# ( onaj što si mi prepravio ili na onaj moj ne radi.....)

molim te za pomoć...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 10:51 - pre 113 meseci
U LinqPad-u, promeni sistem rada sa "C# Expression" na "C# statements" i onda mozes da pises regularan visekomandni c# kod. Da bi neki objekat bacio na izlaz, pozivas ekstenziju Dump() (npr keyEmplist.Dump(); )
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

patak_daca

Član broj: 72199
Poruke: 418
*.dynamic.sbb.rs.



+1 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:18 - pre 113 meseci
U linqpad-u ubacim code

var queryX = from a in Tikets
orderby a.Id_statusa_tiketa ascending
where a.Aktivan == 1

select a ;

queryX = queryX.Where( a => true);

var keyEmplist = queryX.GroupBy(a=>a.VrsteRadovas.Id_vrste_rada).OrderBy(a => a.Key).ToList();

keyEmplist.Dump();

radi odlično,

a isti tak code u C# ne radi...naime

kada idem korak po korak u C# sve do grupisanja drži orderby a kada se uradi groupby order se vrati na stari...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:37 - pre 113 meseci
ovo zvuci kao problem sa SQLom, tj prevodjenu expressiona.
kakav SQL dobijes ?

I probaj sa onom forom sa queryY, da prebacis podatke u memoriju i grupises na klijentu.

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

patak_daca

Član broj: 72199
Poruke: 418
*.dynamic.sbb.rs.



+1 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:38 - pre 113 meseci
Izgleda nešto nije u redu..

čitam ovo http://stackoverflow.com/quest...erby-dismissed-order-operation...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:43 - pre 113 meseci
Da, to objasnjava.

Because it's Enumerable.GroupBy that preserves order. No such promise is made for Queryable.GroupBy.
From the documentation of the former:
The IGrouping(Of TKey, TElement) objects are yielded in an order based on order of the elements in source that produced the first key of each IGrouping(Of TKey, TElement). Elements in a grouping are yielded in the order they appear in source.
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

patak_daca

Član broj: 72199
Poruke: 418
*.dynamic.sbb.rs.



+1 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:48 - pre 113 meseci
Na drugi način radi odlično...orderby ostaje nepromenjen

samo što prijavi grešku

The model item passed into the dictionary is of type 'System.Linq.OrderedEnumerable`2[System.Linq.IGrouping`2[System.Int32,Vezbe_sa_DIV.EF.Tiket],System.Int32]', but this dictionary requires a model item of type 'System.Collections.Generic.List`1[System.Linq.IGrouping`2[System.Int32,Vezbe_sa_DIV.EF.Tiket]]'.

molim te pomozi...

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:53 - pre 113 meseci
Cini i se da pokusavas da reusujes varijablu List tipa da u nju smestis IOrderedEnumerable rezultat iz OrderBy().

To ne moze Iako je nesto deklarisano kao var ono i dalje ima strong type. Ili pozov ToList() ili koristi drugi var
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

patak_daca

Član broj: 72199
Poruke: 418
*.dynamic.sbb.rs.



+1 Profil

icon Re: Linq problem - kako spojiti upit...27.12.2014. u 11:55 - pre 113 meseci
BRAVO mmix !! Odlično radi!! Hvala!!!!!
 
Odgovor na temu

[es] :: .NET :: ASP.NET :: Linq problem - kako spojiti upit...

Strane: 1 2

[ Pregleda: 7605 | Odgovora: 31 ] > FB > Twit

Postavi temu Odgovori

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