[ Sija @ 05.03.2015. 08:31 ] @
Imam npr. ovaj kod kod koga mi se mijeja samo Where uslov i glupo mi je da ga 30 puta prepisujem:

Code:
    Dim db As bazatEntities = New bazatEntities
  Dim db = From s In ConAnalKArtica.FinNalogStavke _
             Where s.Broj = lngBroj 
             Select s.BrojDokumenta, s.Opis, s.Datum, s.Valuta

                dgwLista.DataSource = db.ToList


1.)Pitanje je da li i kako može da se uslov tj. Where mijenja tj. da se pošalje kroz Sub u ovom oblku "s.Broj =" ili "s.BrojDokumenta" tj. da ne pisem sql upite jer ne vidim svrhu koristienja linq-a ako cu pisati sql upite?
2.) Da li se u Where uslov moze staviti If ili Case?

3.) Ne vezano za gornja pitanja da li mi neko moze iz iskustva reci ili postoji neko istrazivanje: Kako je korisnicima lakse unositi podatke vertikalno ili horizontalno tj. da se aplikacija dizajnira tako da npr. textbox-ovi idu horizontalno ili vertikalno kod unosa podataka?

Hvala na bilo kakvom odgovoru.

[ S A J A @ 06.03.2015. 18:21 ] @
Instaliraj System.Linq.Dynamic.Library pa ćeš moći da praviš "dinamičke" uslove, evo primera:

Code:
Dim query = From p In Northwind.Products _
        Where p.CategoryID = 2 And p.UnitPrice > 3 _
        Order By p.SupplierID _
Select p.ProductName, p.UnitPrice


Code:
Dim query = Northwind.Products _
        .Where("CategoryID=2 And UnitPrice>3") _
        .OrderBy("SupplierId") _
        .Select("New(ProductName, UnitPrice)")



If možeš da koristiš i u where i u select delu, imaš primere na netu a select case mislim da nema, moraćeš da se zadovoljiš sa ifovima.
Ovo je neki moj primer povlačenja podataka iz baze. Prvo se u masci postave razni filteri pa se onda povuku podaci.


Code:
     Dim query = From nal In RadFormMain.db.Nalozi
             Where
                nal.Knjiga = knjiga And
                (nal.DatumPrijema >= DatPrijOd And nal.DatumPrijema <= DatPrijDo) And
                If(DatIzdDoIsNull, nal.DatumIzdavanja >= DatIzdOd Or String.IsNullOrEmpty(nal.DatumIzdavanja), nal.DatumIzdavanja >= DatIzdOd And nal.DatumIzdavanja <= DatIzdDo) And
                If(DoktorFilter, nal.DoktorID = DoktorID, nal.DoktorID <> DoktorID) And
                If(StatusFilter, nal.StatusID = StatusID, nal.StatusID <> StatusID) And
                If(NplFilter, nal.NacinPlacanjaID = NplID, nal.NacinPlacanjaID <> NplID)
             Select
                id = nal.ID,
                Broj = nal.BrojNaloga,
                nal.ImeKlijenta,
                Adresa = nal.AdresaKlijenta,
                Kontakt = nal.KontaktKlijenta,
                nal.DatumPrijema,
                nal.DatumIzdavanja,
                Doktor = nal.Doktori.Ime,
                Status = nal.Statusi.Naziv,
                NPL = nal.NaciniPlacanja.Naziv,
                nal.Iznos
            Order By Broj



[ mmix @ 06.03.2015. 20:58 ] @
Ovo sa dynamic stringovima u klauzulama definitivno ubija svaku poentu LINQa i vraca nas na staro vreme SqlReadera i string dependency-a, kad su programi pucali u runtime-u zbog jednog slova.

Svaki element EF.NET (ili Linq2SQL) LINQ-a je neki od ExpressionTree elemenata koji moze da se "ubrizga" u odgovarajucu LINQ konstrukciju i to je pristup koji treba koristiti. Npr (za C#) smo skoro resavali slican problem:
http://www.elitesecurity.org/p3523790

Nisam toliko verziran u VB.NETu ali sigurno postoji slicno resenje koje ce i dalje ostati strong typed naspram modela.


Btw, ta gomila If-ova u WHERE ne izgleda nimalo zdravo Linq od toga napravi jedan ogroman ExpressionTree od kojeg napravi jos grozomorniji SQL upit sa brdom CASE/WHEN/END provera IMHO, bar zakljucno sa EF.NET 5, parser ne radi client-side boolean optimizaciju, sto ce reci svi tvoji filteri idu na SQL server i evaluiraju se na SQL serveru za sve redove. Probaj da primenis metod sa linka koji sam ti dao, dakle za svaki od filtera napravi Expression<Func<TOBJ, bool>> i naredjajih redom u Where lancu (sekvencijalni Where uslovi su isto sto i pojedinacni uslovi povezani AND operator). Tako ces na server slati samo uslove koji ti zaista trebaju.
[ S A J A @ 07.03.2015. 20:46 ] @
Citat:
mmix
Btw, ta gomila If-ova u WHERE ne izgleda nimalo zdravo :D


Znam, to sam koristio u jednoj maloj aplikaciji, za veće stvari koristim ili Stored Procedure (ako je SQL Server) ili DataAdapter sa "golim" SQL upitom (ako je SQLite).

[ Sija @ 08.03.2015. 19:26 ] @
Hvala obojici, za sada cu cini mi se da lupam glavom o sto sa ovim primjerom u C#, a dok ne shvatim ima da se razbacivam mixom malo stored, malo prosljedjivanih u stringu, a malo cisti linq. :D
[ mmix @ 08.03.2015. 21:26 ] @
Citat:
S A J A:
Citat:
mmix
Btw, ta gomila If-ova u WHERE ne izgleda nimalo zdravo


Znam, to sam koristio u jednoj maloj aplikaciji, za veće stvari koristim ili Stored Procedure (ako je SQL Server) ili DataAdapter sa "golim" SQL upitom (ako je SQLite).



Pogledaj ovaj link i primere, na tvom primeru definitivno moze da se iskoristi i tako izbegnu stored procedure. Prva stvar koje covek mora da se oslobodi je da o LINQu razmislja kao o C# (ili vb.net) SQL-u jer on to nije. Drugo, da sve mora da stane u kanonsku formu from..where..select . LINQ je mnogo vise od toga, ta forma je samo ispomoc za rudimentarne oblike upotrebe.