free hit counter
January, 2008 - Pietro Brambati Blog - Site Home - MSDN Blogs

Pietro Brambati Blog

Developer's stories

January, 2008

  • Pietro Brambati Blog

    LINQ to SQL vs LINQ to Entities

    • 13 Comments

    In questo post cercherò di spiegare la differenza di approccio nell'uso di LINQ to SQL e LINQ to Entities e per fare questo riprendo il magnifico esempio fatto da Davide Mauri di UGISS [lo User Group Italiano su SQL Server] che mi ha dato l'idea per approfondire l'argomento. Ammetto che è anche una delle domande più frequenti che mi vengono rivolte quando partecipo ad eventi e che spero quindi, almeno in parte, di chiarire.

    In breve la differenza è quella che riprendo dal mio post precedente.

    Per scaricare l'esempio di Davide, seguete il link [Aggiornato]

    LINQ to SQL è una delle implementazioni di LINQ che sono state 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" solo tabelle. Con LINQ to SQL in sostanza mappiamo uno a uno le tabelle di SQL Server con delle classi e grazie al framework messo a disposizione siamo in grado di fare le classiche operazioni di Insert, Update, Delete e Query.

    LINQ to Entities è un'altra implementazione di LINQ fatta per parlare con l' ADO.NET Entity Framework (EF), sia l'EF che LINQ to Entities sono attualmente in Beta 3. 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.

    Da questa rapida descrizione emerge almeno una considerazione.

    • Il modello ad oggetti usato con EF è diverso da quello usato dal designer di Visual Studio per LINQ to SQL. Possiamo infatti lavorare usando l'EF con relazioni molti-a-molti. Ad esempio possiamo pensare di avere una relazione del tipo autori-libri (cioè un autore può aver scritto più libri e un libro può essere scritto da più autori). Nell'esempio seguente il concetto sarà più chiaro.

    ok, vediamo di chiarirci meglio le idee sul codice partendo dall'esempio di Davide: in cui trovate lo stesso database utilizzato prima in un progetto che usa LINQ to SQL e poi uno che usa LINQ to Entities e quindi l'EF.

    1) Il Database

    Il nostro database potrebbe essere un semplice modello per rappresentare la realtà di un'ipotetica biblioteca, dove un utente[tabella Users] può prendere in prestito [tabella Loans] un libro. Dal punto di vista del nostro esempio ci interessano però le altre tre tabelle quella dei libri [tabella Books] e quella degli autori [Authors]. Che se concettualmente rappresentano una relazione molti-a-molti,dal punto di vista di un database relazione sono mappati come in figura con relazioni uno-a-molti e molti-a-uno, quindi si usa la tebella di "appoggio" BooksAuthors per mantenere le corrette relazioni.

    image

    Vedremo ora come si comporta il designer di Visual Studio 2008 per creare delle classi su questo database e poi vedremo  come usare EF.

    2.1) Designer di Visual Studio 2008

    Il designer di Visual Studio 2008 ci dà un grande aiuto nel creare le classi, che potremmo creare anche a mano e che di fatto rappresentano il nostro modello applicativo. Se guardate la figura seguente che è il risultato di tale procedura vi accorgerete che le tre tabelle del nostro database sono state mappate uno a uno con le classi che useremo poi nella nostra applicazione.

    Nella figura seguente notate il designer delle classi:

    image

    Ciò provoca la creazione di classi parziali (ad esempio una per Author, una per BookAuhtor e una per Book).

    2.2) Usiamo LINQ to SQL

    Avendo tre classi, che fanno parte del nostro DataContext specializzato, cioè della classe con cui ci interfacciamo a livello di codice per fare le operazioni di query,insert, update e delete, se vogliamo inserire un libro scritto da due autori dobbiamo in LINQ to SQL scrivere il codice seguente:

    image

    In buona sostanza una classe Book, due classi Authors e due classi BookAuthors per mantenere le relazioni. Il codice SQL che viene mandato a SQL Server è il seguente:

    image

    Quello che succede sul database è quello che ci aspettiamo, viene inserito il primo libro poi il primo autore, quindi avendo l'id generato per l'autore viene inserito un record nella tabella BooksAuthors, per mantenere il legame logico molti-a-molti tra autori e libri.

    Vediamo ora cosa cambia con l'EF:

    3.1) Designer dell' Entity Framework (EF)

    Se usiamo il designer dell' EF, attualmente in CTP 2, vediamo come possiamo descrivere il nostro modello applicativo. Ecco che dall'esempio in questione notiamo subito una cosa interessante: cioè nonostante il database sia quello dell'esempio precedente, possiamo mappare relazioni molti-a-molti come mostrato in figura:

    image

    Nella nostra applicazione avremo una classe Book ed una Authors da utilizzare, non più come in precedenza la classe di appoggio. A livello di designer la differenza è che abbiamo mappato la relazione molti-a-molti (**)  sulla tabella di appoggio BooksAuthors.

    3.2) Usiamo LINQ to Entities

    A questo punto usiamo LINQ to Entities per lavorare e inserire un libro associato a due autori. Spero sia chiaro la semplificazione delle istruzioni LINQ che seguono, solo legate alla differenza di approccio concettuale nella strutturazione delle classi. Questo è una delle differenze quando si usa l'EF. Avrei potuto anche mappare il mio database uno-a-uno come fatto con l'esempio di LINQ to SQL, questo è quello che farebbe in automatico il designer se importassimo direttamente il database.

    image 

    In questo caso, il codice per inserire un libro e due autori utilizza un numero inferiore di classi. In LINQ to Entities non esite la possibilità di tracciare il codice SQL mandato sul database direttamente nella console application.

    Conclusione

    Nel post avete visto il diverso approccio usato da EF, LINQ to Entities e LINQ to SQL per affrontare un database semplice come quello presentato. L'esempio tende a porre l'attenzione sul supporto di relazioni molti-a-molti. Questa non è l'unica differenza tra le due implementazioni di LINQ, ma è a mio parere quella più significativa.

    EF permette di descrivere il proprio modello applicativo pensando al Modello Entità-Relazioni. E' possibile mappare poi il modello creato, sulle tabelle del database relazionale sottostante (sia esso SQL Server o un altro DBMS di quelli che saranno supportati dall 'EF). L'architettura realizzata si basa sull'uso di tre file XML, che in questo post non ho descritto e la cui complessità è nascosta dal Designer. In generale EF sarà più adatto (al momento come vi dicevo è in Beta 3, mentre il designer usato è in CTP) ad ambienti in cui viene richiesto il supporto a database diversi da SQL Server e in cui l'evolzione del database stesso avviene spesso ad opera di persone diverse da quelle che scrivono le applicazioni. In questi scenari è tipico avere un elevato numero di tabelle che rappresentano logicamente un'entità (Cliente ad esempio) o relazione di ereditarietà tra queste (Persone e Cliente).

    LINQ to SQL rappresenta la giusta soluzione per realizzare applicazioni RAD o per realizzare applicazioni in cui il mapping più sofisticato di EF non è necessario, in questo scenario LINQ to SQL rappresenta il modo più rapido di lavorare con LINQ e SQL Server.

    Vi consiglio la lettura di questo articolo (in Inglese) per ulteriori approfondimenti e spero che questo post sia almeno parzialmente utile a capire il diverso contesto di utilizzo delle due implementazioni di LINQ.

    Ciao

  • Pietro Brambati Blog

    Come odinare numeri pari e dispari ...

    • 31 Comments

    Forse un po' per divertimento (forse non per tutti), ma Stefano mi segnala questo simpatico quesito risolto con LINQ: data una lista di numeri pari e dispari non in ordine (ad esempio : 1,7,9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9) come si separano i numeri pari da quelli dispari ?

    List<int> elenco = new List<int> { 1,7,9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9 };
    var pariEdispari = elenco.OrderBy(s => s % 2 != 0);
    var pariEdispariOrdinati = elenco.OrderBy(s => s % 2 != 0).ThenBy(s => s);
    
    foreach (var item in pariEdispariOrdinati)
    {
          Console.WriteLine(item);
    }

    L'operatore ThenBy si può applicare dopo la OrderBy perchè può essere applicato solo ad una IOrderedEnumerable<T> e non ha una IEnumerable<T>

    Quante righe di codice ci vorrano mai se non si usasse LINQ ?

    Mahh?? Sicuramente non ci penserò durannte il week-end.

    Pietro   Click to IM Pietro
  • Pietro Brambati Blog

    One-Day Web 2008

    • 1 Comments
    CIMG0500

    Alla fine ce l'abbiamo fatta!

    Ieri a Mestre il primo evento di una giornata intera di Xe.Net (non sono sicuro della pronuncia .. al momento).

    L'evento interamente dedicato allo sviluppo web è stato reso possibile grazie a (da sinistra a destra nella foto)  Andrea Dottor, Davide Senatore, Davide Vernole e Andrea Boschin, quest'ultimo detto anche il presidente!

    Materiali

    Slide della mia sessione (PDF 1.3 MB)

    Windows Live Quick Apps (Video.Show) (L'applicazione di esempio che si integra con il servizio Silverlight Streaming di Windows Live e consente di gestire contenuti video)

    Windows Live Tools per Visual Studio 2008 (December CTP) (Controlli asp.net per VS 2008 che consentono di interagire semplicemente con alcuni dei servizi di Windows Live)

     

    Per saperne di più sui servizi per sviluppatori di Windows Live

    Spero di avervi convinto (o almeno incurioriosito) sul fatto che Windows Live è una piattaforma applicativa vera e propria, le cui API e controlli sono disponibili per l'uso nelle nostre applicazioni. Per saperne di più vi consiglio il sito web dedicato ai servizi per sviluppatori di Windows Live (dev.live.com)

     

    Pietro   Click to IM Pietro

  • Pietro Brambati Blog

    Future Web Conference 2008 (FWC 2008)

    • 1 Comments

    FWC2008 (33) Si è da poco conclusa la FWC 2008 : conferenza rivolta alle novità per lo sviluppo web su tecnologia Microsoft. Molti gli argomenti trattati, tutti interessanti e di attualità, raccontati insieme agli amici di aspitalia (in ordine alfabetico :-)) (Cristian Civera, Daniele Bochicchio, Stefano Mostarda): Silverlight 1.0 e 2.0, ASP.NET 3.5 e ASP.NET 3.5 Extensions Preview, LINQ e IIS 7.

    Trovere a breve tutto il materiale sul sito community di ASPitalia.

    Sessione su IIS 7

    Come promesso tutte le informazioni sulla mia sessione su Architettura ed Estendibilità di IIS 7

    Scarica le slide (pdf)

    Come custruire un modulo .NET per implementare l'autenticazione Basic

    Esempio d'implementazione di un Handler + modifica della configurazione + modifica di IIS Manager

    Fun stuff!

    Mi permetto di inserire anche la foto che mi ha cortesemente inviato Stefano, per darvi  un'idea di come è andata la giornata ... ovviamente io sono quello più piccolino al centro

    squallidi4 

    Grazie a tutti per la partecipazione!

    Pietro   Click to IM Pietro

  • Pietro Brambati Blog

    Windows Live Tools for Microsoft Visual Studio - Parte II

    • 4 Comments

    Dal mio precedente post sui tool di Windows Live per Visual Studio 2008, è stata rilasciata la nuova CTP degli stessi che potete scaricare gratuitamente a questo link. Per seguire l'esempio di questo post dovete scaricare tutti i requisiti necessari.

    Tra i controlli disponibili c'è quello dei contatti: con cui potete visualizzare i contatti del vostro messenger direttamente nella pagina.

    1) Uso del controllo dei contatti

    Dopo aver creato un sito ASP.NET Windows Live Web Site, come ho già mostrato, nella toolbar vi trovate il nuovo controllo Contacts. Fate drag-and-drop e vi troverete il controllo nella pagina, che potete vedere nella doppia visualizzazione in slipt (cocice e preview) di Visual Studio 2008 nella figura seguente.

    image

    Premendo ora F5 per far partire l'applicazione vedrete all'interno della pagina la parte in cui il controllo verrà visualizzato, premendo su log-in potete fare login con il vosto account Windows Live ID e alla fine avrete i vostri contatti del messenger nella finestra. Potete anche filtrare i vostri contatti in base a quelli che sono on-line, busy etc.

    image image  

    A questo punto se cliccate sull'icona di un contatto che è on-line potete mandargli un messaggio.

    2) Avere informazioni sul contatto nell'applicazione

    Una delle cose che potremmo voler fare avendo a disposizione i nostri contatti è poter utilizzare le informazioni del loro profilo per interagire con il sito stesso. Se ad esempio ho un sito che vende fiori e io come visitatore voglio far inviare un mazzo di fiori a mia madre, potrei selezionare il contatto e avere direttamte tutte le informazioni del contatto stesso, come ad esempio l'indirizzo a cui far inviare il regalo floreale.

    Quindi come prima cosa cambiamo la proprietà del nostro controllo nella proprietà View, dal valore di default TitleList a List, questo cambia la visualizzazione della lista dei contatti aggiungendo dei check box per selezionare il contatto, come in figura:

    image

    A questo punto basta che guardiamo la lista degli eventi messi a disposizione dal controllo e aggiungiamo un handler al nostro contatto sull'evento ServerData, operazione che fa in automatico Visual Studio facendo invio sul valore della proprietà dell'evento. Nel codice di esempio uno dei parametri che il runtime passa è ServerDataEventArgs, che contiene le informazioni del contatto selezionato.

    Infatti a questo punto basta selezionare (impostando il flag nel check box) un contatto dal controllo, quindi premere il tasto "Send Selected Contacts", se la nostra applicazione è in debug vedremo il contenuto del contatto, come in figura - ho omesso nel flusso la pagina di autorizzazione che viene presentata per l'invio delle informazioni:

    image

     

    In questo modo abbiamo accesso ai dati del contatto dell'utente a cui quest'ultimo vuole mandare il regalo e quindi il nostro sito potrà usare tali informazioni senza farle digitare direttamente al visitatore.

    Conclusione

    In quest'esempio avete visto come utilizzare il controllo dei contatti contenuto nei Tools per Visual Studio 2008 di Windows Live e di come sia facile utilizzare tale controllo in una pagina ASP.NET, siamo andati anche un po' oltre pensando ad un piccolo scenario in cui un sito web potrebbe rendere più semplice la vita ad un utente che vuole fare un regalo, evitandogli di inserire delle informazioni che sono di fatto già presenti in quelle del contatto.

    Vi ricordo che in generale trovate tutte le informazioni sull'uso di Windows Live nell'apposito sito dedicato agli sviluppatori: dev.live.com, qui trovate i rifementi a come utilizzare direttamente le API per interagire con i  contatti. Queste API rappresentano un approccio alternativo all'uso del controllo per ASP.NET. Tali API consentono di avere maggiore granularità sui permessi. Le potete provare direttamente utilizzando l'apposito Contacts API Interactive SDK ....

    Pietro   Click to IM Pietro
  • Pietro Brambati Blog

    Nasce powershell.it (beta)

    • 1 Comments

    image Grazie ad Efran Cobisi, nasce Powershell.it.

     

    Cos'è ?

    "il portale di riferimento della community italiana degli utenti di Windows PowerShell.
    Fornirà due linee principali editoriali, una destinata agli amministratori di sistema, con articoli tecnici, tutorial, guide all'uso, l'altra dedicata agli sviluppatori di script e cmdlet (una cmdlet è una classe .NET in grado di interagire con Windows PowerShell ed apportarne nuove funzionalità), con articoli, focus e snippet di codice"

    Mi unisco ai colleghi d'oltreoceano come Jeffrey Snover nel fare i complimenti ad Efran.

    Per registrarsi alla community ...

    Ciao

    -Pietro

  • Pietro Brambati Blog

    aspitalia + CardSpace

    • 3 Comments

    Ieri Daniele mi manda una mail dicendo ... ci siamo! Ci si può loggare al sito community di aspitalia, usando una card self-issued. Oggi l'annuncio ufficiale da parte della community: Habemus CardSpace, che vi invito a leggere.

    Come loggarsi avendo già un account ?

    Seguo le dettagliatissime istruzioni per loggarmi, avendo già un account.

    1) Vado alla pagina dove inserisco le mie solite credenziali

    image

    Dopo aver inserito le usuali username e password, mi trovo alla pagina successiva dove posso associare il mio account ad una card.

    2) Associo una Card al mio account

    image

    Premendo sull'icona di autenticazione ecco che posso creare una nuova card self-issued o utilizzare una card esistente da assoicare al mio profilo. Premendo sull'icona ecco che parte l'Identity Selector con la lista delle Card utilizzabili o che dà la possibità di crearne una... nel mio caso ne seleziono una esistente.

    image

    Ecco fatto! La prossima volta che accederò al sito avrò la possibilità di utiliizare la card prescelta, ora associata al mio account, senza dover redigitare nome e password: infatti premendo sull'immagine con il simbolo della Card (in viola) riapparirà l'Identity Selector che mi darà la possibilità di autenticarmi ... funziona, provare per credere!

    Non è passato molto tempo quando lo scorso anno proprio all'evento community Real Code Day 2 parlai di come integrare Windows CardSpace con una applicazione web esistente, associando una card self-issued ad un account esistente di una applicazione web... certe volte i sogni si avverano ...

    -Pietro

Page 1 of 1 (7 items)