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 (22)
  1. matteo says:

    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

  2. PietroBr says:

    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

  3. sirus says:

    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.

  4. PietroBr says:

    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.

  5. matteo says:

    beh, allora… mi siedo e aspetto di provarlo. probabilmente la mia diffidenza è dovuta inconsciamente  alla mia preparazione in materia, non certo perfetta …

    ciao

    m.

  6. PietroBr says:

    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.

  7. Da diversi mesi ormai mi sono avvicinato (di soppiatto ) a LINQ ed alle due diverse declinazioni che

  8. In questo post cercherò di spiegare la differenza di approccio nell’uso di LINQ to SQL e LINQ to Entities

  9. In questo post cercherò di spiegare la differenza di approccio nell'uso di LINQ to SQL e LINQ to

  10. LINQ to SQL e LINQ to Entities

  11. Marcello says:

    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

  12. Marcello says:

    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

  13. PietroBr says:

    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

  14. Marcello says:

    Ok, proverò con il Contains.

    e per il MAX(MYDATE) come posso ovviare ?

    Grazie

  15. Marcello says:

    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

  16. PietroBr says:

    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

  17. Marcello says:

    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.

  18. Marcello says:

    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)

  19. Cristian says:

    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.

  20. PietroBr says:

    Ciao Cristian,

    credo che quello che ti serva sia una cosa diversa. A seconda dei requisiti dello storico. In alcuni contesti ad esempio esistono duue db uno con la transazione vera e propria ed uno di audit. quando eseguo un operazione nel primo eseguo contestualmente una transazione nel secondo per traccia l’operazione eseguita …

    Se vuoi mandami una mail con qualche requisito in più su quello che devi fare che vedo di darti un consiglio più preciso.

  21. Cristian says:

    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

  22. PietroBr says:

    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…

Comments are closed.

Skip to main content