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

LINQ to SQL - razna pitanja

[es] :: .NET :: LINQ to SQL - razna pitanja

Strane: 1 2

[ Pregleda: 7706 | Odgovora: 29 ] > 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 to SQL - razna pitanja03.05.2008. u 17:12 - pre 194 meseci
BTW, ne znam dal ste primetili ali dbml dizajner kada generise entitete iz baze sam provaljuje plural imena entieta po engleskoj terminologiji, tako ad kad koristis tabela sa nazivima na naskom, npr Radnik, dobijas sledece

var radnici = from r in db.Radniks select r;
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

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: LINQ to SQL - razna pitanja03.05.2008. u 18:08 - pre 194 meseci
Jeste. Meni su tabele u mnozini ali je objekte kreirao u jednini (a kolekcije opet u mnozini). Mnogo je bre pametan :)

Isprobao sam ono..
kada uradim ovo on kreira novi hotel i lepo iskoristi postojecu drzavu:
Citat:

Dim h As New Hotel

h.HotelName = "testhotel"
h.Country = (From c In db.Countries Where c.ID = 152 Select c).First()
db.Hotels.InsertOnSubmit(h)
db.SubmitChanges()


Ali kada uradim ovo:
Citat:

Dim h As New Hotel

h.HotelName = "testhotel"
h.Country = New Country() With {.CountryName = "Serbia", .ID = 152}
db.Hotels.InsertOnSubmit(h)
db.SubmitChanges()


Pokusa da napravi novi Country i prijavi gresku jer je ID Identity. E sad, kako on zna da je u jednom slucaju drzava dobijena iz baze a u jednom kreirana "rucno" - pojma nemam :)

[Ovu poruku je menjao Shadowed dana 04.05.2008. u 00:11 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: LINQ to SQL - razna pitanja03.05.2008. u 19:22 - pre 194 meseci
To je zato sto ti je razmisljanje jos uvek fokusirano na DataSet funkcionalnost. Fundamentalna razlika u LINQu je sto entiteti ne cuvaju svoje database stanje, kao sto je to radio DataRow i DataTable, nemas rowstate, nemas dirty flag, nista od toga ne postoji u entitetima, zato su tako i "mrsavi" (sto je sa druge strane dobro kad treba da ih serijalizujes). Sam DataContext objekat cuva reference svih entiteta koje dobije bilo od tebe bilo od baze zajedno sa sync stateom tog entiteta. Kad si ga ucitao u prvoj varijanti, context ga je zapamtio i tako znao da taj podatak vec postoji u bazi, kad si ga kreirao sa New i dodao u kontekst kontekst ga je prihvatio kao novo kreirani entitet i zakljucio da treba da ga posalje bazi kao INSERT.

Isto tako iz tog razloga entiteti implementiray propertychange, tako context uhvati informaciju da si promenio neko polje u objektu i odmah ga markira za update.

Inace, kad radis:
h.Country = (From c In db.Countries Where c.ID = 152 Select c).First()

forsiras select nad Country tabelom u bazi da bi kreirao Country objekat, a vec imas njegov ID, umesto toga uradi samo

h.CountryId = 152;


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

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: LINQ to SQL - razna pitanja03.05.2008. u 23:23 - pre 194 meseci
Hah. Ako kreiram nov hotel i hocu da ga submit-ujem, netje da radi :)
Elem, ID mu je Integer i po default-u 0 i vec postoji u tabeli. Mogao bih da uzmem najveci ID iz tabele i dodelim za 1 vise, ali to nije bas lepo resenje a i stavio sam da je ID Identity kolona. Ako probam MyHotel.ID = Nothing, ne prolazi jer nije Nullable i Nothing biva konvertovano u 0 (u C#-u bi mozda izbacio exception).
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: LINQ to SQL - razna pitanja04.05.2008. u 09:15 - pre 194 meseci
Nesto ti nije dobro ili u object modelu ili u bazi.

Proveri da li ti je polje u bazi int identity. To je neophodno da bi kljuc bio generisan na nivou baze (gde i treba).


Dalje pogledaj HotelID polje u Hotel entitetu (ne znam da li si koristio dbml ili si sam pravio entitete) u svakom slucaju HotelId property u Hotel entitetu mora da bude okicen sa sledecim parametrima COlumn atributa:

Code:

[System.Data.Linq.Mapping.Column(
AutoSync=AutoSync.OnInsert, 
DbType="Int NOT NULL IDENTITY", 
IsPrimaryKey=true, 
IsDbGenerated=true)]


u suprotnom nece raditi jer ce LINQ for SQL smatrati da polje nije autogenerisano u bazi i probace da insertuje sa konkretnom vrednoscu koja je u propertiju. I btw, odmah da ti kazem da je losa praksa imati identity (0, 1) polje u bazi, bolje pocni od 1 cisto zbog situacija u kojima bi ti 0 predstavljalo zamenu za NULL.



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

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: LINQ to SQL - razna pitanja04.05.2008. u 10:50 - pre 194 meseci
Moja greska :\
Nekako (pretpostavljam da sam zaboravio), u bazi nije bilo podeseno da kolona bude identity. Koristim dbml. Promenio sam u bazi, ali nisam znao kako da ga nateram da skonta sam (osim da izbacim pa ubacim tabelu) pa sam samo promenio u property-u za tu kolonu. Atributi su kao sto si naveo.
Ne pravim identity(0,1), ostavljam po default-u (1,1) nego nije bio identity a insertovao sam jedan koji je prosao sa Nothing->0 :)
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: LINQ to SQL - razna pitanja28.05.2008. u 23:45 - pre 193 meseci
Postoji li neki bolji nacin da se ovo uradi?
Code:

If db.persons.count(function(p as person) p.name="pera") > 0 then
    dim pera as person = db.persons.first(function(p as person) p.name="pera").surname="peric"
else
    db.insertonsubmit(new person() with {name="pera", surname="peric"})
end if
db.submitchanges()


Znaci, poenta je da ako objekat sa zadatim uslovom postoji bude update-ovan, ako ne postoji kreira se nov. Ovako ima 2-3 upita, moze li bolje? :)

Edit: izvinjavam se na nekoriscenju velikih slova, al' nisam pisao u VS-u...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: LINQ to SQL - razna pitanja29.05.2008. u 11:17 - pre 193 meseci
FirstOrDefault() jeste resenje, ali Take(1) i SqlMethods.Like su visak ovde.

Take(1) ce u ovom kontekstu uraditi TOP(1) sto je isto sto ce uraditi i FirstOrDefault() samo sto ce upotreba ova dva metoda uporedo izazvati kreiranje subquery-a u SQL-u (select TOP 1 t1.lista from (select top 1 t0.lista from t0 where LIKE operator) as t1) sto je suboptimalno.
SqlMethods.Like generise LIKE operator bez implicitnog % (koje generise BeginsWith i EndsWith) i kao takav ovde nije bas primenljiv posto on ima eksplicitnu jednakost. Dakle, najefikasnije resenje koje moze da ponudi LINQ to SQL je sa dve skripte:

Code:

Dim p = (From o In DB.Persons Where o.FirstName = "Pera" Select o).FirstOrDefault()

If p Is Nothing Then
     DB.Persons.InsertOnSubmit(New Person With {.FirstName = "Pera", .LastName = "Peric"})
Else
     p.LastName = "Peric"
End If

DB.SubmitChanges()

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

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: LINQ to SQL - razna pitanja29.05.2008. u 11:24 - pre 193 meseci
To sam i ja prvo mislio, ali u MSDN-u kaze:
Citat:
Return Value
Type: TSource

default(TSource) if source is empty; otherwise, the first element in source.


pa nisam bio siguran da li ce biti Nothing ako nema rezultata u bazi. Mada, meni bi bilo logicno da i .First vraca Nothing ako nema rezultata (ovo bi mi do sada olaksalo gomilu stvari :)).
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: LINQ to SQL - razna pitanja29.05.2008. u 13:19 - pre 193 meseci
Citat:
Shadowed: pa nisam bio siguran da li ce biti Nothing ako nema rezultata u bazi. Mada, meni bi bilo logicno da i .First vraca Nothing ako nema rezultata (ovo bi mi do sada olaksalo gomilu stvari ).
default ima smisla samo kad query transformise objekat u value type, npr akd vracas ID koji je int, FirstOrDefault() ce vratiti nula ako nema redova, za sve reference tipove default vrednost je null (nothing)

Citat:
Djoks: - Što se tiče SqlMethods - može se izbaciti, ali sam je uveo namjerno zbog primjera njene upotrebe (što sam i napisao). Može biti pogodna zbog svojih funkcija za baratanje datumima... Tvoj kod bih, mmx, ipak izmijenio i zadržao ili LIKE ili SqlMethods iz prostog školskog razloga: imena u SQL upitima valja porediti sa LIKE. Mnogo elegantnije nego uvođenje ToUpper, ToLower itd. U protivnom: "Najdanović" != "NAJDANOVIĆ" != "najdanović" što kod imena/prezimena/naziva ne smije biti slučaj.

- Na kakve dvije skripte misliš?


SqlMethods postoji samo iz jednog razloga, da linq to sql query-je snabde operacijama koje nisu mogle da se uglave u "standardne" metode tipova kojima se barata, sto ovde ukljucuje transformacije datuma i LIKE bez implicitnih wildcards (imaj samo u vidu da LIKE bez wildcards radi isto sto i "=" operator) da bi mogao da pravis LIKE operacije koristeci custom patterns, sto ne mozes kroz metode i ekstenzije string tipa (izuzev ogranicenih 'pattern%' i '%pattern' pretrazivanja kroz navedene BeginsWith i EndsWith metode, npr za pattern nalik 'pera ___ic', tj sve pere koje se prezivaju na pet slova sa ic moras da koristis SqlMethods.Like)

Tvoja primedba sa skolskom primenom LIKE takodje nema osnova. .NET CLR jeste case sensitive ali LINQ to SQL nasledjuje case i collation iz baze sa kojom operise, tako da ako ti je sama baza case insensitive Pera i PERA su isto, a sve i da ti je baza case sensitive LIKE ti nece preskociti to i zaboraviti da poredi case stringova. Pride je LIKE skuplji jer mora da skenira ceo index/kolonu, a posebno to sto LIKE trtira %, ^, [, ], _ kao wildcards pa je za unete parametre koji ih sadrze kao literale neophodno preformatirati string pre slanja u LIKE. Prvi put cujem da neko propoveda upotrebu LIKE bez wildcards kao efiksaniju zamenu za =, to jednostavno ne pije vodu.


Dve skripte:

Code:
Dim p = (From o In DB.Persons Where o.FirstName = "Pera" Select o).FirstOrDefault()
generise prvu SQL skriptu

a DB.SubmitChanges() generise drugu, bilo insert bilo update, u zavisnosti od toga kojom granom je IF prosao.


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

[es] :: .NET :: LINQ to SQL - razna pitanja

Strane: 1 2

[ Pregleda: 7706 | Odgovora: 29 ] > FB > Twit

Postavi temu Odgovori

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