Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 31 odgovor
  • 10.385 pregleda

Najnovija ↓

Re: Linq problem - kako spojiti upit... 26.12.2014. u 23:02 · pre 144 meseca #21
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.
Potpis
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ć
Re: Linq problem - kako spojiti upit... 26.12.2014. u 23:26 · pre 144 meseca
izmenjeno 1 put, poslednji put mmix 26.12.2014. u 23:46
  1. mmix26.12.2014. u 23:46zapis iz teksta poruke
#22
Drugi savet koji imam da ti dam je da ne preterujes mnogo :D 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.
Potpis
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ć
Sviđa mi se1
Re: Linq problem - kako spojiti upit... 27.12.2014. u 08:51 · pre 144 meseca #23
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
Re: Linq problem - kako spojiti upit... 27.12.2014. u 09:32 · pre 144 meseca #24
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ć...
Re: Linq problem - kako spojiti upit... 27.12.2014. u 11:51 · pre 144 meseca #25
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(); )
Potpis
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ć
Re: Linq problem - kako spojiti upit... 27.12.2014. u 12:18 · pre 144 meseca #26
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...
Re: Linq problem - kako spojiti upit... 27.12.2014. u 12:37 · pre 144 meseca #27
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.
Potpis
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ć
Re: Linq problem - kako spojiti upit... 27.12.2014. u 12:43 · pre 144 meseca #29
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.
Potpis
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ć
Re: Linq problem - kako spojiti upit... 27.12.2014. u 12:48 · pre 144 meseca #30
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...

Re: Linq problem - kako spojiti upit... 27.12.2014. u 12:53 · pre 144 meseca #31
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
Potpis
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ć
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme