LINQ to SQL e LINQ to Entities
In questi intensi giorni che sto vivendo qui al TechEd a Barcellona ho avuto la possibilità di intervistare Luca Bolognese, italiano di nascita e ormai da tempo in quel di Redmond, dove lavora come Lead Program Manager.
In questo video intervista Luca ci parla di LINQ to SQL e LINQ to Entities e delle future direzioni che questi due framework potranno avere, degli scenari per il loro utilizzo e di come LINQ cambierà il modo in cui programmiamo oggi.
Un piccolo riassunto tecnico, che spero sia utile come introduzione al video:
LINQ to SQL è una delle implementazioni di LINQ che verranno rilasciate con Visual Studio 2008. LINQ to SQL è il modo più semplice per poter lavorare con SQL Server usando un nuovo modello di programmazione in C# 3.0 e Visual Basic 9. In questo modo nel nostro linguaggio .NET preferito scriviamo del codice che si avvicina ad una sintassi SQL rendendo di fatto meno complicato far "parlare" le nostre applicazioni fatte di classi, clicli e quant'altro con SQL Server, un DBMS relazionale in cui "vediamo" tabelle.
LINQ to Entities è un'altra implementazione di LINQ fatta per paralre con l' ADO.NET Entity Framework (EF), sia l'EF che LINQ to Entities verranno rilasciati dopo Visual Studio 2008, l' EF è infatti attualmente in Beta 2. L'EF è un framework che consentirà agli sviluppatori di lavorare con un maggior livello di astrazione, cioè uno sviluppatore si concentrerà solo sul modello concettuale proprio del modello Entità-Relazione, in maniera indipendente dallo storage sottostante sia esso SQL Server o un altro database. Ad esempio potrò lavorare con un' entità Cliente che potrà mapparsi su uno storage relazione anche su più di una tabella. Se volete saperne di più sulla Beta 2 dell' ADO.NET Entity Frameowrk, seguite pure questo link, in cui trovate una breve introduzione all' EF e a LINQ to Entites.
Spero sia utile
-Pietro
Comments
Anonymous
November 07, 2007
sinceramente LINQ non mi sembra un gran cosa... sembra una feature creata tanto per fare qualcosa (e confondere ancora di più)... e il fatto che nasca già con due standard differenti non gioca a suo favore. poi magari, e ne sarò felice, verrò smentito e tra 5 anni scrivere LINQ statement sarà la prassi... però ora mi sembra molto macchinoso e non ne vedo l'utilità (ma io sono solo un mobile developer e non un guru....) ciao e complimenti per il blogAnonymous
November 07, 2007
Se parli di LINQ, ci sono in realtà diverse implementazioni per scenari diversi. Ad esempio posso usare la sintassi di linq per accedere ad oggetti, a nodi XML, a Dataset e anche come hai visto a strutture relazionali. Per te che sviluppi per dispositivi mobili puoi usare alcune di quste implementazioni in scenari con il Compact Framework 3.5. Ritengo che LINQ in tutte le sue forme sia una delle novità più importanti nei linguaggi di programmazione, ne sentivo l'esigenza sin da quando ero in univerità. Ti invito a guadare al mio webcast su LINQ (il 27/11) in cui cercerò di mostrarvi meglio il valore di LINQ, spero sia utile, alla peggio puoi sempre non utilizzarlo :-) Ciao e grazie per aver contiviso il tuo punto di vista -PietroAnonymous
November 08, 2007
Io ho provato LINQ insieme a C# 3.0 e devo dire che è una delle innovazioni che preferisco del nuovo ambiente di sviluppo. I risvolti sono fantastici ed alleggeriscono di molto alcune pratiche di programmazione che spesso sono macchinose e noiose.Anonymous
November 08, 2007
Un'altra cosa interessante è che alcune delle novità sono legate al compilatore e non a CLR o alle estensioni nuove del linguaggio. Quindi è possibile scrivere codice C# 3.0 con Visual Studio 2008, che usa costrutti come Local Type Inference, Object Initializer etc, che semplificano e rendono più leggibile il codice, e poi far girare il programma generato su un computer dove è installato solo il Framework 2.0. Il codice MSIL generato è infatti lo stesso. Ovviamente questo non vale per tutte le novità del linguaggio, linq per primo, ma è interessante sapere come è evoluto il linguaggio.Anonymous
November 08, 2007
beh, allora... mi siedo e aspetto di provarlo. probabilmente la mia diffidenza è dovuta inconsciamente alla mia preparazione in materia, non certo perfetta ... ciao m.Anonymous
November 08, 2007
Non preoccuparti: personalmente ritengo i linguaggi di programmazione affascinanti, so che per molti sono cose nuove e ci vuole tempo per capirle e farle proprie, spero che quello che troverai in giro sull'argomento possa esserti utile realmente.Anonymous
January 13, 2008
Da diversi mesi ormai mi sono avvicinato (di soppiatto ) a LINQ ed alle due diverse declinazioni cheAnonymous
January 22, 2008
In questo post cercherò di spiegare la differenza di approccio nell'uso di LINQ to SQL e LINQ to EntitiesAnonymous
January 22, 2008
In questo post cercherò di spiegare la differenza di approccio nell'uso di LINQ to SQL e LINQ toAnonymous
March 21, 2008
LINQ to SQL e LINQ to EntitiesAnonymous
September 19, 2008
Avrei la necessità di trasformare una query SQL in query LINQ, qualcuno può darmi una mano ? Posto di seguito la mia query: SELECT * FROM myTable WHERE MYCODE+MYYEAR+MYMONTH+MYDATE IN( SELECT MYCODE+MYYEAR+MYMONTH+MAX(MYDATE) AS DATACO FROM MyTable WHERE MYCODE = 12345 GROUP BY MYCODE,MYYEAR,MYMONTH,MYCODE) Grazie in anticipoAnonymous
September 19, 2008
correggo la mia query: SELECT * FROM myTable WHERE MYCODE+MYYEAR+MYMONTH+MYDATE IN( SELECT MYCODE+MYYEAR+MYMONTH+MAX(MYDATE) AS DATACO FROM MyTable WHERE MYCODE = 12345 GROUP BY MYCODE,MYYEAR,MYMONTH,MYDATE) Grazie in anticipoAnonymous
September 20, 2008
Ciao Marcello usa Contains: http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx La IN non esiste in L2SQL, anche se poi il codice SQL generato può, ove necessario, contenerlo. Mi riocordo (se la memoria non m'inganna) qualche esempio sul blog di Marco Russo .... -PietroAnonymous
September 21, 2008
Ok, proverò con il Contains. e per il MAX(MYDATE) come posso ovviare ? GrazieAnonymous
September 21, 2008
inoltre ho notato che la funzione di group by di LINQ è differente rispetto a quella di SQL... quindi in realtà non ottengo lo stesso risultato! Se ti viene in mente qualche suggerimento sarà ben accetto! GrazieAnonymous
September 22, 2008
Ciao Marcello, non sono sicuro di aver capito bene il senso della query, ma forse qualcosa del genere ricalca quello che fai. Magari mandami una mail da questo blog .... che ne parliamo off-line var query = from t in dc.MyTables where t.MYCODE == 12345 group t by new { code = t.MYCODE,year = t.MYMONTH, mounth = t.MYMONTH, date = t.MYDATE } into g select g.Key.code + g.Key.year + g.Key.mounth + g.Max(date => g.Key.date); var query2 = from t in dc.MyTables where query.Contains(t.MYDATE + t.MYMONTH + t.MYYEAR+ t.MYCODE) select t; -PietroAnonymous
September 22, 2008
Innanzitutto grazie mille Pietro per l'interessamento... ho provato subito quanto da te suggerito... io credo che tu abbia colto perfettamente ciò che mi serve ottenere, però purtroppo anche con il codice da te suggerito, mi vengono restituiti più record per lo stesso codice... è come se il "g.Max(date => g.Key.date)" non funzionasse bene come discriminante per includere un'unica riga con il codice identico.Anonymous
September 22, 2008
il massimo che sono riuscito ad ottenere è con questo: var query = from t in dc.MyTable where t.MyCode == 12345 group t by (t.MyCode) into gb select new { Key = gb.Key, HighDate = from t1 in gb where t1.MyDate == gb.Max(t2 => t2.MyDate) select t1 }; In questo modo ottengo sì un solo record per il mio codice, però poi mi perdo per strada le altre info che mi servono per comporre la chiave unica del mio record (MYCODE+MYYEAR+MYMONTH+MYDATA)Anonymous
May 22, 2009
Ciao, ho sviluppato un applicativo che utilizza LINQ per aggiornare ed inserire i dati su DB. Successivamente mi è stato richiesto di effettuare una sorta di "storico" di tutte le attività svolte su DB. Ho subito pensato alla comodissima proprietà di Log del DataContext, il problema però è che si pretende che il log generato sia uno script sql rieseguibile. Purtroppo però il log così generato non è eseguibile perchè al suo interno si utilizzano parametri che non sono definiti. Riporto un esempio: SELECT COUNT(*) AS [value] FROM [dbo].[TAB1] AS [t0] WHERE [t0].[TAB2] = @p0 -- @p0: Input VarChar (Size = 4; Prec = 0; Scale = 0) [AAA] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 questo codice non è eseguibile perchè manca la definizione del parametro @p0! Spero sia questione di qualche settaggio, o comunque ci sia una soluzione semplice, perchè trovo il problema piuttosto bloccante. Grazie mille.Anonymous
May 22, 2009
The comment has been removedAnonymous
May 22, 2009
Pietro grazie mille per la risposta, ho capito cosa intendi ma la mia necessità è assolutamente più semplice (sempre che si possa fare), vorrei che LINQ mi generasse lo script SQL di quello che andrà a fare sul DB a fronte di un SubmitChangesAnonymous
May 22, 2009
questo non è possibile di per sè, a meno di fare il parsing dell'output della Log e costruire quindi la query, ma non mi sembra una bella cosa, meglio un trigger su database che generi un output in seguito ad una operazione specifica...