[ Mikelly @ 11.09.2008. 14:19 ] @
Poceh da radim neku malu aplikaciju, citam podatke iz .csv fajla pa trpam u dataset pa onda u bazu, ali jos bazu nisam napravio, tek sam poceo.

Sad imam konkretan problem. Imam dataset koji sadrzi odredjen broj redova, i treba mi da iz citave tabele izvucem samo neke vrijednosti koje se ne ponavljaju. Kao npr. u SQL-u "SELECT DISTINCT UserName FROM Tabela".

Da li to mogu da odradim koriscenjem datatable objekta? Probao sam Select() i Compute() metodama, ali mi ne ide... Ne znam ni da li to uopste moze... Moze naravno pjeske da prolazim kroz zapise jedan po jedan.

Ali sam onda krenuo na drugi nacin, i tu mi se otvorise pitanja. Napravio sam listu zapisa:

Code:

List<DataSet1.DataRow> = new List<DataSet1.DataRow>();


pa sam probao koriscenjem Exist() metode koja zahtijeva predikat.

Prvo pitanje: Predikat mora da ima samo jedan argument i taj agument mora biti onog tipa kojeg je i lista? Ne moze imati dodatne argumente? Je li tako?

Drugo pitanje: Da li predikat mora biti static? Takva je definicija u helpu.

Ako je static, onda ne mogu da vrsim promjenljiva uporedjivanja tako da koristim exist() metodu unutar petlje, i u svakoj iteraciji vrsim drugacije uporedjivanje, jer u okviru predikta ako je static ne mogu bez da koristim standardno uporedjivanje. Evo, mozda bude jasnije. Prvo sa static:

Code:

private bool static ImaLiGa(DataSet1.DataRow r)
{
if(r.UserName == "Milos") return true;
else return false;
}


E sad bez static, ali ne znam da li ovo moze, oce li pravit kakve probleme:

Code:

private bool ImaLiGa(DataSet1.DataRow r)
{
if(r.UserName == user) return true;
else return false;
}


gdje je user promjenljiva iz viseg nivoa koju mijenjam u svakoj iteraciji, pa je vidljiva u prediktu, to ne bi bio slucaj da je predikat static.

Da li je ovaj runaround korektan, i da li postoji neko drugo rjesenje (ovo u vezi predikata)? I neki komentari u vezi listi, ako mozete, teh ih otkrivam...

Pozdrav.
[ mmix @ 11.09.2008. 14:42 ] @
AKo koristis odgovarajuci framework mozes da iskoristis LINQ za ovo:

Code:

var un = (from DataRow t in ds.Tables["tabela"].Rows
          select t["polje"]).Distinct();

foreach (string user in un) Console.WriteLine(user);
          


Ovo je za netipizirani dataset, adaptiras za tipizirani ako treba.


PS> A mozes i u duhu "LINQ to DataSets" ekstenzija:

Code:

            var un = (from t in ds.Tables["tabela"].AsEnumerable()
                      select t.Field<string>("polje")).Distinct();
[ Mikelly @ 14.09.2008. 10:01 ] @
E, znam za LINQ, a reci mi molim te, mada pretpostavljam da ne treba, trebam li imat VS2008, ili to sve radi sa VS2005 i 3.5 Framework-om?

I znas li kad izlazi ovaj novi ADO.NET EF?

Pozdrav.

[ mmix @ 14.09.2008. 10:25 ] @
Treba ti vs2008, zapravo treba ti C#3.0 kompajler, kompajler u 2005 je 2.0 samim tim ne prepoznaje LINQ konstrukcije.


Inace ADO.NET Entity Framework je izasao, runtime je u .NET frameworku 3.5 SP1, dok su alatke u service packu 1 za visual studio 2008.