Udostępnij za pośrednictwem


LINQ to SQL e LINQ to Entities

image

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 blog

  • Anonymous
    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 -Pietro

  • Anonymous
    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 che

  • Anonymous
    January 22, 2008
    In questo post cercherò di spiegare la differenza di approccio nell'uso di LINQ to SQL e LINQ to Entities

  • Anonymous
    January 22, 2008
    In questo post cercherò di spiegare la differenza di approccio nell'uso di LINQ to SQL e LINQ to

  • Anonymous
    March 21, 2008
    LINQ to SQL e LINQ to Entities

  • Anonymous
    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 anticipo

  • Anonymous
    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 anticipo

  • Anonymous
    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 .... -Pietro

  • Anonymous
    September 21, 2008
    Ok, proverò con il Contains. e per il MAX(MYDATE) come posso ovviare ? Grazie

  • Anonymous
    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! Grazie

  • Anonymous
    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; -Pietro

  • Anonymous
    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 removed

  • Anonymous
    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 SubmitChanges

  • Anonymous
    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...