counter free hit invisible
Welcome to MSDN Blogs Sign in | Join | Help

Pietro Brambati Blog

.NET development

News




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

Posted: Tuesday, November 06, 2007 5:48 PM by pietrobr

Comments

matteo said:

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

# November 8, 2007 3:51 AM

pietrobr said:

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

# November 8, 2007 4:03 AM

sirus said:

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.

# November 8, 2007 1:14 PM

pietrobr said:

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.

# November 8, 2007 2:07 PM

matteo said:

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

ciao

m.

# November 9, 2007 3:11 AM

pietrobr said:

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.

# November 9, 2007 4:55 AM

Impedance Mismatch said:

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

# January 13, 2008 11:53 AM

Pietro Brambati Blog said:

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

# January 22, 2008 12:51 PM

Noticias externas said:

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

# January 22, 2008 1:04 PM

Il blog di Francesco Orlando said:

LINQ to SQL e LINQ to Entities

# March 21, 2008 9:37 AM

Marcello said:

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

# September 19, 2008 12:23 PM

Marcello said:

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

# September 19, 2008 2:47 PM

pietrobr said:

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

# September 21, 2008 6:07 AM

Marcello said:

Ok, proverò con il Contains.

e per il MAX(MYDATE) come posso ovviare ?

Grazie

# September 21, 2008 1:12 PM

Marcello said:

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

# September 22, 2008 3:56 AM

pietrobr said:

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

# September 22, 2008 11:07 AM

Marcello said:

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.

# September 22, 2008 12:07 PM

Marcello said:

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)

# September 22, 2008 12:15 PM

Cristian said:

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.

# May 22, 2009 8:33 AM

pietrobr said:

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.

# May 22, 2009 10:22 AM

Cristian said:

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

# May 22, 2009 10:41 AM

pietrobr said:

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

# May 22, 2009 10:53 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 

  
Enter Code Here: Required

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Page view tracker