Ok, nije pivoting, malo sam zbrzao odgovor jer sam video tri vrste uplata a tebi treba samo jedna kategorija (Osnovne uplate) tako da nam pivot ne treba. Odmah da ti nesto kazem, sve (ali BAS SVE) sto moze da uradi Select() mozes da uradis i u foreach petlji BOLJE i BRZE od select metoda, razlika nije ubiustvena ali uvek postoji. Iz tih razloga ja nikad ne koristim taj metod, ni pre LINQa ga nisam koristio. parametar select metoda je WHERE klauzula koja moze da se implementira sa prostim foreach+if/then
Dakle resenje sa foreach petljom bi ti bilo:
Code:
foreach (MainDataSet.KlijentRow krow in ds.Klijent)
{
decimal ukUplate = 0, ukZaduzenja = 0;
foreach (MainDataSet.UplataRow uplataRow in krow.GetUplataRows())
if (uplataRow.vrstaUplate == vrstaZaduzenjaUplate.Osnovna.ToString()) ukUplate += uplataRow.Iznos;
foreach (MainDataSet.ZaduzenjeRow zaduzenjeRow in krow.GetZaduzenjeRows())
if (zaduzenjeRow.vrstaZaduzenja == vrstaZaduzenjaUplate.Osnovna.ToString()) ukZaduzenja += zaduzenjeRow.Iznos;
}
i vreme izvrsavanja pada sa 500ms na oko 300ms, u oba slucaja medjutim nema govora o nekoliko minuta, cak ni sa select tako da mi nije bas jasno kako si dobio takav rezultat. Najvece usporenje ovde ti pravi poredjenje stringova pre nego kompleksnost algoritma (poredjenje strigova uvek dodaje *O(n) u ciklicni algoritam jer za svaku iteraciju mora da uradi internu petlju da uporedi n karaktera), ako enum kodiras numericki i smestis u int polje brzina ce biti skoro identicna kao u pocetnoj varijanti. U svakom slucaju LINQ varijanta ovog upita (cije vreme izvrsavanja je otprilike isto) je:
Code:
var final = from k in ds.Klijent
join uu in
(from u in ds.Uplata
where u.vrstaUplate == vrstaZaduzenjaUplate.Ostalo.ToString()
group u by u.IDKupac
into uu
select new { IDKupac = uu.Key, UkupnoUplata = uu.Sum(x => x.Iznos) })
on k.ID equals uu.IDKupac into ug
join uz in
(from u in ds.Zaduzenje
where u.vrstaZaduzenja == vrstaZaduzenjaUplate.Ostalo.ToString()
group u by u.IDKupac
into uz
select new { IDKupac = uz.Key, UkupnoZaduzenje = uz.Sum(x => x.Iznos) })
on k.ID equals uz.IDKupac into zg
from uglo in ug.DefaultIfEmpty()
from zglo in zg.DefaultIfEmpty()
select
new
{
k.ID,
k.Ime,
k.Prezime,
UkupnoUplata = uglo == null ? 0 : uglo.UkupnoUplata,
UkupnoZaduzenje = zglo == null ? 0 : zglo.UkupnoZaduzenje
};
Nema neke mudrosti, samo se ogranici sors tabela pre agregacije.
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ć