free hit counter
Pietro Brambati Blog - Site Home - MSDN Blogs

Pietro Brambati Blog

Developer's stories

  • 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

    Uno sguardo a ASP.NET Dynamic Data – parte 1

    • 21 Comments

    Una delle novità presenti nella SP1 di .NET 3.5 sono i Dynamic Data (DD), o meglio ASP.NET Dynamic Data. In estrema sintesi i DD consentono di generare un sito web completo partendo da un modello dei dati. Vi è mai capitato di dover costruire un’applicazione web in poco tempo, niente di eccezionale, solo per poter permettere di fare operazioni di interrogazione e modifica su una sorgente dati?

    Bene, i DD sono pensati proprio per questi scenari: si parte da un modello dei dati costruito con LINQ to SQL o Entity Framework (ma non solo..) e su questo, delle pagine aspx fungono da template generici, essendo in grado di capire quali tabelle sono presenti nel modello dei dati, di capire come sono fatte e di visualizzarle così come renderle modificabili. Esiste quindi un template unico (condiviso da tutte le tabelle) per le operazioni tipiche che su queste potremmo fare (interrogazione, modifica etc).

    Un altro aspetto importante riguarda il motore di routing su cui si basano, che consente di non legare l’url che chiamiamo nel browser per richiedere una specifica pagina a dove la pagina fisica risieda oppure a come questa si chiami. Inoltre è possibile modificare il comportamento del motore di routing tramite delle regole, in un unico punto, senza dover modificare alcunché nelle singole pagine e come queste si richiamino tra di loro.

    Partiamo con un semplice esempio:

    Da Visual Studio 2008 SP1 ( oppure con Visual Web Development Express 2008 SP1) scegliamo uno dei due nuovi template disponibili:

    image

    Scegliamo Dynamic Data Web Application, perché pensiamo di generare il modello dei dati con LINQ to SQL, se volessimo usare Entity Framework dovremmo scegliere Dynamic Data Entities ….

    Date ora un rapido sguardo al progetto generato che contiene la cartella DynamicData, che a sua volta contiene i template che vi dicevo sopra, in particolare guardate la sottocartella PageTemplates che contiene i template usati dai DD. Qui trovate una descrizione delle pagine incluse di default.

    E’ interessante anche il folder FiledTemplate in cui trovate come viene eseguito il rendering di uno specifico tipo, ad esempio il file Boolean.ascx e Boolean_Edit.ascx contengono il codice che viene generato a runtime tutte le volte che si deve generare la parte di pagina che visualizza una colonna del database di tipo boolean e, come avrete capito, il comportamento cambia se siamo in fase di visualizzazione piuttosto che editing del campo. Quindi, in un unico punto, è stato centralizzato il comportamento per la visualizzazione e la modifica dei singoli campi delle tabelle del database. Posso modificare il codice qui e vedere le modifiche apportate ogni volta che viene visualizzata una colonna che fa riferimento ad un campo boolean su db, di una qualsiasi pagina che venga renderizzata. I DD hanno anche un meccanismo che consente di fare un po’ il contrario: di specificare cioè che un particolare campo boolean, di una particolare tabella sia visualizzato in modo completamente diverso che dagli altri. Vedremo meglio questo meccanismo di estendibilità in un altro post.

    Per ora procediamo oltre e aggiungiamo un modello dei dati basato su LINQ to SQL. Dal menù: Add new Item, quindi scegliamo Linq to SQL Classes, “agganciamo” il nostro database Northwind, o quello che preferite, e senza preoccuparcene troppo facciamo drag & drop di tutte le tabelle, alla fine ci troviamo più o meno nella situazione in figura:

    image

    Nella figura trovate evidenziati il folder DynamicData e il file del modello dei Dati Northwind.dbml.

    Ora andiamo nel file global.asax, semplicemente scommentiamo la riga di codice in cui informiamo i DD del nostro modello, “registrandolo” e aggiungendo il DataContext che mi ha creato il designer, NorthwindDataContext , imponendo a true l’attributo ScaffoldAllTables, che in soldoni dice ai DD di utilizzare tutte le tabelle del mio modello dei dati. E’ doveroso ricordare, come il commento nella stessa pagina global.asax ricorda, questa può non essere la cosa migliore da fare, ma per ora, per il mio esempio, può andare.

    Premendo F5 vediamo la nostra applicazione già bella che fatta. In figura vedete la prima schermata che mostra l’elenco delle tabelle

    image

    Per renderci conto di quanto sia potente il meccanismo di discovery del modello dei dati usato dai DD, premiamo il link che ci porta alla tabella Products, la pagina list.aspx che viene invocata, è un template completamente generico, è in grado di visualizzare correttamente la tabella Products.

    Nella seguente figura, ho evidenziato gli aspetti notevoli che i DD ci mettono a disposizione gratuitamente:

    image

    I DD si accorgono :

    • che la tabella Products ha una relazione di foreign-key con la tabella Category ed invece di mostrarci l’ID della Categoria, ad esempio 1 per il primo prodotto, ci mostra il nome della categoria, cioè Beverages. Potente, no! Lo stesso vale per Supplier.
    • Mettono a disposizione un menù per fare operazione di filtraggio: guardate Discontinued, Category, Supplier: che è generato dinamicamente in base a quali campi boolean e alle relazioni foreign-key presenti nella tabella prodotti.
    • Seguendo i link Edit, Delete e Details si giunge a delle pagine che servono proprio per le operazioni suddette, che ovviamente sono generate a partire dagli altri template, anch’essi generici e adattabili a qualsiasi tabella.

    Il tutto finora semplicemente scrivendo una riga di codice nel file global.asax.

    Il Routing

    Se torniamo al file global.asax, noterete come viene generato l’url per navigare l’applicazione web generata:

    image

    L’url viene composto con il nome della tabella e il nome delle action, a cui viene aggiunta l’estensione aspx. Ora cos’è l’action ? Possiamo pensare alle action come alle azioni eseguite sulla pagina dall’utente. Esiste l’enum PageAction che contiene le action usate di default dai DD. Con un esempio si potrebbe dire che se l’utente clicca sul link Edit, per modificare come è fatto un singolo prodotto, la pagina esegue la relativa action PageAction.Edit e il motore di routing invoca la corrispondente pagina, nell’esempio sopra sarà dunque la pagina Edit.aspx, che trovate nel folder dei template in Page templates.

    Per renderci conto di quanto sia flessibile il motore di routing, possiamo provare ad aggiungere due nuove regole. Le regole seguenti valgono solo sulla tabella “Supplier”.

    image

    Attenzione : le regole hanno una precedenza, quindi dobbiamo applicare queste due regole prima di quella presente di default che è più generica. Questa regola agisce quando scegliamo la tabella Supplier (durante la navigazione ). In questo caso sia che l’utente scelga di selezionare la lista di tutti i supplier (PageAction.List), che scelga di selezionare il singolo supplier (PageAction.Details), la pagina che la visualizza sarà la ListDetails.aspx (anche questa è una delle 4 pagine presenti di default nel folder Page Templates). Nella definizione della regola ViewName è il nome della pagina aspx (senza estensione) che deve farne il rendering. Mentre in verde vedete l’url che apparirà nella address bar del browser, che può essere quello che volete, in questo caso ho semplicemente rimosso l’estensione “.aspx” alla fine dell’url.

    Conclusione

    I DD vanno ad arricchire le funzionalità delle WebForms, offrendo un framework per realizzare applicazioni web data-driven. In questo post abbiamo visto brevemente come iniziare ad usarli vedendo i principi di base del loro funzionamento.

    I DD offrono comunque un meccanismo che permette molte forme di personalizzazione, permettono di usare dei template particolari per fare il rendering di campi specifici di una tabella usando ad esempio i controlli dell’ AJAX Control Toolkit o di terze parti ad esempio per selezionare un calendario, oppure uno slider per decidere una quantità numerica. Le pagine degli ASP.NET Dynamic Data sono già pensate per sfruttare i controlli ASP.NET AJAX.

    Altri attributi consentono di impostare delle regole di validazione sul modello dei dati, ad esempio posso impostare tali regole direttamente sulle proprietà delle classi generate da LINQ to SQL, creando delle partial class. Questo meccanismo consente di accentrare le regole di validazione, che poi “fluiscono” nella UI e valgono in qualsiasi pagina web si faccia riferimento a quella specifica classe...

    Spero di avere stuzzicato la vostra curiosità , almeno per chi non ha ancora avuto modo di provare i nuovi ASP.NET Dynamic Data.

    Link utili

    MSDN library ASP.NET Dynamic Data

    www.asp.net/dynamicdata/

  • Pietro Brambati Blog

    Internet Explorer 8 : sulla compatibilita'

    • 1 Comments

    [Update 11/3]

    IE8 al momento è stato rilasciato in versione RC1. Una delle cose che preferisco del nuovo IE8 è il fatto che è stato pensato con l’idea di offrire il maggior supporto possibile agli standard W3C per il layout delle pagine : W3C Cascading Style Sheets Level 2.1 , W3C Selectors API, ed un supporto limitato alle W3C Cascading Style Sheets Level 3 Specification (Working Draft), non ancora in effetti un vero e proprio standard.

    IE8 verrà rilasciato con un nuovo motore di layout, che sarà quello abilitato di default per la visualizzazione delle pagine. Il supporto verso questi standard W3C consentirà di sviluppare un sito web che funzioni correttamente su diverse versioni di browser, quindi non solo IE, che li supportano.

    Ma cosa succede per i siti che sono stati sviluppati in precedenza, per versioni precedenti di Internet Explorer ? In questi siti potrebbero presentarsi dei problemi di visualizzazione e nell’esecuzione del JScript che utilizzano il version Vector e la User Agent String per generare codice di logica applicativa, ritornerò dopo su questo punto.

    Diciamo che si possono vedere 4 possibili aspetti per quanto rigurda la compatibilità:

    1. Sviluppare (o modificare) il sito per IE 8, nella modalità standard
    2. Usare la document compatibility
    3. Siti nella intranet / Siti web segnalati a Microsoft
    4. L’utente può intervenire sul modo in cui IE visualizza un sito

    1 Sviluppare per IE 8

    E’ sicuramente quello a cui tendere nel futuro se si ha già un sito esistente perchè assicura la maggior compatibilità agli standard W3C. Non è necessario modificare subito il proprio sito proprio, perchè IE8 introduce la document compatibility

    2. Usare la document Compatibility

    IE 8 per mantenere la compatibilità ha introdotto una funzionalità che si chiama document compatibility, grazie a questa è possibile far  funzionare

    IE8 al momento è stato rilasciato in versione RC1. Una delle cose che preferisco del nuovo IE8 è il fatto che è stato pensato con l’idea di offrire il maggior supporto possibile agli standard W3C per il layout delle pagine : W3C Cascading Style Sheets Level 2.1 , W3C Selectors API, ed un supporto limitato alle W3C Cascading Style Sheets Level 3 Specification (Working Draft), non ancora in effetti un vero e proprio standard.

    IE8 verrà rilasciato con un nuovo motore di layout, che sarà quello abilitato di default per la visualizzazione delle pagine. Il supporto verso questi standard W3C consentirà di sviluppare un sito web che funzioni correttamente su diverse versioni di browser, quindi non solo IE, che li supportano.

    Ma cosa succede per i siti che sono stati sviluppati in precedenza, per versioni precedenti di Internet Explorer ? In questi siti potrebbero presentarsi dei problemi di visualizzazione e nell’esecuzione del JScript che utilizzano il version Vector e la User Agent String per generare codice di logica applicativa, ritornerò dopo su questo punto.

    Diciamo che si possono vedere 4 possibili aspetti per quanto rigurda la compatibilità:

    1. Sviluppare (o modificare) il sito per IE 8, nella modalità standard
    2. Usare la document compatibility
    3. Siti nella intranet / Siti web segnalati a Microsoft
    4. L’utente può intervenire sul modo in cui IE visualizza un sito

    1 Sviluppare per IE 8

    E’ sicuramente quello a cui tendere nel futuro se si ha già un sito esistente perchè assicura la maggior compatibilià agli standard W3C. Non è necessario modificare subito il proprio sito proprio, perchè IE8 ntroduce la document compatibility

    2. Usare la document Compatibility

    IE 8 per mantenere la compatibilità ha introdotto una funzionalità che si chiama document compatibility, grazie a questa è possibile far funzionare IE8  in un delle tre diverse modalità di rendering della pagina, che sono:

    • Quirk : l’equivante della modalità quirk usata da IE6 e IE7
    • IE7 Standard: la modalità di visualizzazione usata da IE7
    • IE8 Standard: (default) la modalità usata di default da IE8 vista in precenza

    In particolare tramite un tag meta posto nell’ header della pagina o via http header si può assegnare uno dei valori presenti nella tabella seguente:

    image

    Oppure la potete vedere da questo flow chart dal blog di Giorgio Sardo

    image

    Quindi se abbiamo un sito che viene visualizzato correttamente con IE7 e volgiamo aspettare a fare le modifiche per rendere più compatibile con gli standard quello che possiamo fare è usare il tag con il valore IE=EmulateIE7. Questo fa si che IE8 si comporti come IE7, che, scusate il gioco di parole, si usa una delle due modalità di layout proprie che vedete in tabella e per che sono guidate dalla presenza (o meno) della direttiva DOCTYPE nella pagina. Questo ci garantisce per la parte di layout, ma se abbiamo scritto del codice JScript non proprio corretto che usa la User-Agent-String o il Version-Vector ? Ok, ne parliamo dopo..

    Come impostarlo:

    2.1 Impostando il tag meta nella pagina HTML (page-per-page)

    image

    2.2 usando un header http

    Ad esempio a livello file web.config

    image

    Usando la console di IIS 7

    image

    Per altre versioni di IIS e Apache

    3. Siti della Intranet/Siti web Segnalati a Microsoft

    Se da IE8 premete tools, Compatibility View Setting, vi apapre la seguente schermata In cui vedete che potete impostare i due check box che ho evidenziato, con cui:

    • vedete in compatibilità i siti della Intranet (default)
    • potete ricevere da Microsoft una lista dei siti più grossi che hanno seganlato delle incompatibilità con la modalità standard di IE8.

    image

    4. L’utente può intervenire su come vede un sito

    Anche l’utente, se non dovesse vedere bene un sito può intervenire premendo un bottone accanto a quello del browser, abilitando la Compatibility View. Questo fa visualizzare il sito nella modalità usata da IE7 Standard:

    image

    Il bottone non viene visualizzato nei seguenti casi:

    • InPrivate mode attivo
    • una pagina che usa il tag meta o header e richiede a IE8 di essere visualizzata in IE8 Standard mode
    • Navigo sulla intranet ed è attivo il checkbox “Display intranet sites in Compatibility View” visto prima
    • E’ attivo il checkbox “Display all websites in Compatibility View”
    • E’ attivo il checkbox “Include updated website lists from Microsoft”
    • La Developer toolbar è attiva e si stanno usando i tasti per la compatibilità (vedi dopo)

    Questo equivale ad usare, come visto il valore IE=EmulateIE7, tranne per una piccola cosa:

    Ho tracciato usando Fiddler la chiamata per vedere come è fatta la User-Agent-String (UA) (questa identifica l’identità del browser e viene inviata al server via header http):

    image

    La UA riporta che la chiamata è fatta da un browser IE 7(MSIE 7.0) , cosa che non avviene se imposto il tag meta o uso l’header http visto in precedenza, in cui verei MSIE 8.0. E’ però possibile capire lato codice (sia client che server) che sta parlando di un IE8 perchè esiste la nuova dicitura  Trident/4.0. In pratica per essere più chiaro:

    image

    Ora che dovrebbe essere un po’ più chiaro per quanto riguarda la document compatibilty, che quindi può essere modificata anche dall’utente, supponiamo di aver migrato il sito ed essere compatibili con IE8 Standard mode, possiamo usare il tag meta o l’header http visto in precedenza per forzare l’IE8 dell’utente a lavorare nella sua modalità standard, per far questo usate il valore IE=EmulateIE8, che se riguardate la tabella vista in precedenza ha proprio questo scopo.

    User Agent String

    Spesso la User-Agent String, viene usata sia lato server che client per implementare della logica differente da browser a brower è quindi importante che sia scritto bene il codice che controlla la versione del browser e che tenga quindi presente anche di IE8.

    Su MSDN trovate un esempio di una funzione tipo che usando le regual expression estrae il valore correto:

    image

    Version Vector (VV): IE 6, IE7, IE8 ?

    Il VV è una funzione tipica solo di Internet Explorer. in una chiave di registry è salvata la versione del browser, quella che viene visualizzata nell’ help.

    Ora potete scrivere dei commenti condizionali che in base alle diverse versioni del browser, e generare codice di markup opportuno, ad esempio se voleste supportare nel vostro siti più versioni di Internet Explorer.

    Su MSDN trovate un esempio d’uso delVV, con cui potreste implementare logiche diverse per caricare CSS diversi, ad esempio

    image

    Testing dei siti

    Per testare i vostri siti potete procedere in due modi

    • scaricate le Virtual Machine per IE6, IE 7 e IE 8 apposite per testare le diverse configurazioni
    • Premendo F12 in IE8 attivate la Developer Toolbar con cui potete testare Live il vostro sito operando

    image

    Operando sul tasto Browser Mode:

    • Internet Explorer 7: la UA contiene MSIE 7.0 , NON c’è il token Trident/4.0
    • Internet Explorer 8: la UA contiene MSIE 8.0 + Trident/4.0
    • Internet Explorer 8 (Compatibilty View): la UA contiene MSIE 7.0 + Trident/4.0

    Operando su Document Mode:

    • Se il browser Mode è su IE 8 o IE8 Compatibility view : potete scegliere uno dei tre motori di rendering di IE8 (Quirk, IE 7 Standard, IE 8 Standard)
    • Se il browser Mode è su IE 7: potete scegliere tra una delle modalità di rendering di IE 7: Quirk o IE7 Standard

    WebBrowser Control

    Se utilizzate il controllo WebBrowser (WebOC) in un’applicazione WinForm o WPF, il comportamento di default è che la pagina caricata viene visualizzatam in modalità di compatibiltà con IE7. E’ possibile cambiare il comportamento del WebOC agendo su un’opportuna chiave di registry:

    Abilitare la modaltità IE8 Standard: MyApplication.exe è il nome dell’applicazione  che usa il WebOC

      [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
      "MyApplication.exe" = dword 8000 (Hex: 0x1F40)

    Quindi operando sulla chiave di registry FEATURE_BROWSER_EMULATION è possible impostare tre modalità: IE8 Standards Mode, IE7 Standards Mode e IE8 Standards Mode (Forced). Quest’ultima modalità sarà aggiunta nella RTM  di IE8 e forzerà la modalità IE8 Standard ignorando se la pagina visualizzata è stata inserita nella compatibility list. Trovate altre informazioni sul post del team di IE qui. ecco la parte più interessante della tabella con i valori di questa chiave. Le tre righe nell’ordine si riferiscono alle tre diverse modalità dette prima.

    image 

    Link utilli per approfondimenti:

  • Pietro Brambati Blog

    ASP.NET MVC 2 Preview 2: Client-Side Validation

    • 6 Comments

    In my opinion one of the most interesting features of ASP.NET MVC 2.0 Preview 2 is the support for client-side validation.

    How-to enable Client-Side validation

    Client-side validation enable your application to perform client-side validation based on model’s validation by JQuery validation library. Ok, it’s simpler than it sounds.

    The client-side validation framework is even extensible, but for now it suits my simple needs.

    In my post on ASP.NET MVC 2.0 Preview 1 I’ve added server-side validation to my application model using metadata as ASP.NET Dynamic Data does. So, for example, in the the picture below I’ve added a partial class to my model and a class for metadata describing my requirements for validation. In the following code the attribute ‘Titolo’ must be not null, and I’ve added an Error Message if something’s wrong.

    image

    If I run the application all works fine: I show a view page to the user, user enters some value and press Save to submit to server. If the user doesn’t fill the title field he gets an error as soon as we made a POST to server. You can see the page flickering in the browser.

    Client-side validation prevent your app going to the server for validation and all happens client side, but using the rules you have defined on the partial class you saw before.

    To enable client side validation, you can follow these easy steps:

    • use Html.EnableClientValidation method on the View file
    • insert three javascript files : jquery-1.3.2.js, jquery.validate.js, MicrosoftMvcJQueryValidation.js. These files are included in the Scripts directory coming with ASP.NET MVC 2 Preview 2 project template. 

    I’ve put the code in my view page for editing some simple fields.

    image

    Now I can run my application and see the results, I’m using HttpWatch to see that no requests are performed to the server and the validation logic works as expected.

    image

    As soon as I type something into the textbox the red message disappears.

    Nice feature! You can download the ASP.NET MVC 2 Preview 2 from here and read about all the features on Phil Haack post.

    Enjoy :-).

  • Pietro Brambati Blog

    Silverlight 2 – (alcune) risorse

    • 2 Comments
    Updated 1/9/2008

    Percorso formativo in italiano

    Aggiornamento del percorso formativo su Silverlight 2, ecco i link diretti, ai webcast in italiano:

     

    Il primo webcast è visibile in streaming qui

     

    Post utili 

    Ho trovato molto utili questi post fatti dopo il rilascio della beta 2:

    Introduzione

    User Interface

    Networking

    Visual State Manager

    Styling e Skinning(o Templating)

    BCL

    HTML Bridge

    Animazioni

    Varie

    Documentazione

    Spero che vi risulti interessante il materiale che vi ho segnalato e se trovate qualche altro link, lasciate pure un commento a questo post.

    -Pietro

  • Pietro Brambati Blog

    Microsoft WebMatrix: uno sguardo

    • 0 Comments

    Da oggi tramite il Web Platform Installare 3.0 è disponibile la beta del nuovo Microsoft WebMatrix, con cui è possibile scrivere siti web in modo molto semplice. Questo tool non va a sostituire Visual Studio, ma è pensato per chi vuole usare un’ approccio ancora più semplice allo sviluppo web ed in cui Visual Studio sarà d’aiuto in una fase successiva. In particolare il modello di sviluppo utilizza un nuovo View Engine per ASP.NET, che sarà disponibile anche nella prossima versione di ASP.NET MVC.

    In questo post vedremo una rapida guida. Installiamolo dal Web Platform Installer, selezionando la voce presente nel seguito.

    Installazione

    image

    Questo installerà:

    • IIS Express
    • SQL Server CE 4.0 CTP
    • “Razor”, il nuovo View Engine che offre una sintassi semplice e compatta.
    • Il tool vero e proprio: Microsoft WebMatrix.

    La prima applicazione – La sintassi @

    Lanciamo ora WebMatrix, apparirà la schermata seguente:

    image 

    • Possiamo creare un’applicazione PHP o ASP.NET partendo da un sito nella Web Gallery
    • Partire da un sito scegliendo un template.

    Nel nostro caso selezioniamo quest’ultima opzione perchè mi dà modo di mostrarvi la nuova sintassi ASP.NET. Scegliamo tra i siti i template disponibili, io ho scelto “Bakery” e ho dato il nome MyBakery, come vedete nella figura seguente:

    image

    Ora avete un sito web già fatto, di cui potete ispezionare i file. Il sito è fatto usando il nuovo View Engine e potete usarlo per impadronirvi della nuova sintassi, che come vedrete richiede poco sforzo e soprattutto riutilizza le conoscenze di .NET che già abbiamo. Qui e qui trovate due esempi di dettaglio sulla sintassi, non tutti funzionanti nella beta attuale, ma che verranno aggiunti via via.

    image

    I file hanno estensione .cshtml e contengono una parte di codice in CS ed un parte di codice HTML. In particolare nella pagina Default.cshtml trovate un blocco di codice identificato dal simbolo @, ove viene definita la pagina che contiene la struttura del sito, la master-page se volete, associata alla proprietà LayoutPage e viene valorizzata la proprietà PageData[“Title”]. Dove verrà usata? Apriamo la pagina _Layout.cshtml.

    image

    In questa pagina, che contiene la struttura del sito, viene usato il valore impostato nella PageData[] utilizzando la sintassi @, questa volta non all’interno di un blocco di codice, ma per sotituire il valore impostato nella pogina Dafault.cshtml che abbiamo visto in precedenza. Come potete immaginare il risultato che arriverà al browser dell’utente sarà il “merging” delle due pagine.

    Possiamo anche provare a fare una piccola modifica per visualizzare la data corrente. Nella Default.cshtml aggiungiamo il codice evidenziato in rosso dove uso la classe .NET DateTime.

    image

    Lanciamo ora l’applicazione usando il menù a Ribbon di WebMatrix che ci permette di scegliere tra alcuni dei browser che abbiamo installato per la preview, scegliamo IE.

    image

    Il risultato sarà:

    image

    Che conterrà la data che volevamo visualizzare. Il sito web creato vive in un folder locale all’utente e si trova in un path simile a questo: C:\Users\<user>\Documents\My Web Sites\MyBakery

    Dove sta girando l’applicazione? IIS Express

    Con WebMatrix è stato installato anche il nuovo IIS Express, trovate l’icona in basso nella system tray e se vi cliccate vedete i siti che sono in esecuzione.

    image

    IIS Express è una versione di IIS pensata per lo sviluppatore: da un lato offre le funzionalità di IIS 7.x tra cui il supporto a HTTPs e la possibilità di fare URL Rewrite, dall’atra parte la flessibiltà di un Developer Server, come quello al momento presente in Visual Studio. IIS Express consente di essere copiato su una macchina Windows, anche XP, non gira però come servizio e non richiede diritti amministrativi, ma deve essere lanciato come un semplice eseguibile, in questo caso lo fa direttamente WebMatrix. Inoltre ha una configurazione per utente che trovate nel folder “C:\Users\<utente>\Documents\IISExpress8”.

    Il Database con SQL Server CE 4.0

    L’applicazione d’esempio utilizza anche un database, se cliccate nel menù in basso potete vederlo in modo più esplicito anche se si trova nell’usuale (per ASP.NET) folder AppData.

    image

    Da WebMatrix potete creare semplicemente un Database; creare, cancellare tabelle e campi. Il risultato finale sarà un semplice file con estensione .sdf. WebMatrix installa anche il nuovo SQL Server CE 4. Questa nuova versione di SQL Server CE offre nuove funzionalità: tra cui il supporto per l’utilizzo server-side di dababase in memoria, che gireranno appunto sul server in contesti altamente multi-threaded. Inoltre questo modello offre la semplicità di fare la copia del file sdf su un server sul quale non è necessarimanete richiesto di installare un DBMS per poter far funzionare l’applicazione. Potete ben immaginare come questo approccio sia adatto a soluzioni a basso traffico, ma in caso vogliate, potete poi migrare verso un prodotto che offra scalabilità maggiore e migrare il database direttamente da WebMatrix.

    Per vedere come l’applicazione accede al database aprite il file Order.cshtml:

    image

    Come vedete per aprire la connessione al database basta usare l’API Database.Open e passare come parametro il nome del database, il resto è a carico di ASP.NET, non poteva essere più semplice di così. Vi ricordate, l’obiettivo di questo prodotto è la semplicità,  e non la flessibilità di usare la strategia di accesso ai dati migliore, che spesso va a scapito della prima, ma che in altri contesti sarebbe un requisito irrinunciabile.

    Ad ogni modo dalla request viene recuperato il parametro productId e poi viene eseguita una query tramite la chiamata .QuerySingle in cui mi aspetto venga ritornato un unico record dal database.

    Report e analisi per SEO

    L’utima funzionalità che vi voglio mostrare di WebMatrix è la possibilità di fare analisi del sito relativamente alle problematiche di Search Engine Optimization (SEO). Queste analisi possono essere molto utili nel momento in cui vogliamo che il nostro sito sia visibile su internet.

    Nel mio caso o fatto qualche modifica al sito, come rimuove il tag Title dall’ Header della pagina HTML, in questo caso:

    image

    In questo caso ho un report con warning ed errori veri propri, che mi avvertono di problemi in cui posso incorrere e che impediscono ad un motore di ricerca d’ indicizzare correttamente il sito. Cliccando sull’errore avrete anche maggiori dettagli:

    Conclusione

    Il nuovo WebMatrix è rivolto agli sviluppatori di siti web che cercano un modello semplice e lineare per integrare ad una pagina HTML/CSS/Javascript l’interazione e la dinamicità necessari al funzionamento di un sito web, lasciando però aperti gli occhi a sviluppi e modelli futuri...

    ASP.NET si arricchisce di una nuova sintassi semplificata rivolta a chi parte sviluppando pagine HTML e successivamente aggiunge dinamicità. La nuova sintassi è lineare e semplice da imparare e fa uso di .NET, offrendo quindi un linguaggio compilato e strongly-type. Il nuovo View Engine viene usato per la prima volta con WebMatrix ma ne verrà esteso il funzionamento a Visual Studio 2010 e alla prossima versione di ASP.NET MVC in particolare ne costituirà una possibile scelta.

    Inoltre come avete visto da poco sono disponibili IIS Express e SQL CE 4.0 in preview, strumenti che possiamo comunque pensare di utilizzare con Visual Studio 2010 e che verranno in seguito integrati.

    Potete trovari una serie di post molto dettagliati su questi argomento sul blog di ScottGu qui, qui, qui e qui.

    Download

    Potete scaricare WebMatrix e installarlo da qui.

  • 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

    Silverlight 3 e i .NET RIA Services – parte 1

    • 18 Comments

    I .NET RIA Services (attualmente in Preview rilasciata dopo il MIX09) sono molto interessanti per chi scrive applicazioni e vuole esporre entità tramite servizi e poi consumarle da Silverlight 3. Pensiamo ad esempio ad una piccola applicazione, costruiamo lo strato di accesso ai dati con Entity Framework, vogliamo poi costruire uno strato di servizi per esporre gli stessi dati ad un’applicazione silverlight 3.

    Requisiti

    Per seguire il mio esempio dovete avere installato:

    Attenzione: se sulla vostra macchina sviluppate anche con Silverlight 2, usate una macchina virtuale per Silverlight 3 beta, perchè dopo l’installazione dei tool la macchina sarà configurata per questa versione di Silverlight, la 3 appunto e non vi sarà supporto per creare progetti Silverlight 2.

    Esempio

    Creiamo un nuovo progetto Silverlight 3,  potete anche usare il nuovo template Silverlight Navigation …

    image

    Nella maschera successiva, lasciate impostato il flag “Link to ASP.NET server project”. Questo creerà un legame tra il nostro servizio e l’applicazione client (Silverlight) generando ad ogni compilazione delle classi per Silverlight ed il relativo modello che permetteranno l’interazione con la corrispondente parte lato server.

    image 

    Creiamo uno strato di accesso ai dati

    Ora al nostro progetto aggiungiamo un semplice strato di accesso ai dati fatto con Entity Framework, usando northwind e prendendo la tabella Customers, che creerà la corrispettiva classe, immagino fino a qui sia più o meno tutto noto e le immagini seguenti siano esplicative:

    image

    image

    Nel disegno futuro potrete usare qualunque tecnologia per lo strato di accesso ai dati usata insieme ai .NET RIA Services: LINQ to SQL, vari ORM, semplici oggetti .NET etc, etc.

    Creiamo ora il mid-Tier usando i RIA Service

    Ora, sempre sul progetto web, che contiene ora il nostro file.edmx, possiamo aggiungere un DomainDataService. Questo nuovo template per VS 2008:

    • crea un servizio REST-based, rendendo possibili operazioni CRUD sulla nostra sorgente dati.
    • ci permette di esporre i metadati relativi alle nostre entità. Questi possono essere molto utili in caso volessi aggiungere delle regole di validazione sul modello stesso dei dati (vedete dopo).

    Quindi, Add New Item, selezionare Domain Service Class, chiamiamo il nostro servizio ad esempio CustomersService, ad esempio

    image

    Ora nella schermata seguente abbiamo la possibilità di selezionare le Entità e se abilitare la modifica su queste, questo creerà dei metodi di Update, Insert e Delete. Inoltre selezionate il flag per creare la classe dei metadati, che ci servirà dopo per la validazione.

    image

    l’opzione Enable Client Access è importante: questa crea il legame tra il mid-tier, il nostro progetto web che espone dati, ed il progetto Silverlight 3. Ogni volta che compilo l’applicazioni vengono create delle classi proxy, che si mappano sul modello.

    Le classi lato server

    Sul server ora vengono create due classi, la prima customerModel, contiene i metoti per ottenere/inserire/modificare e cancellare i nostri customers, le entità del nostro modello:

    image

    la classe CustomersModel.metadata.cs contiene i metadati relativi

    Le classi lato client: Silverlight

    Se compiliamo il progetto, vengono prodotte in automatico delle classi proxy, per vederle in Visual Studio, possiamo usare il bottone per visualizzare tutti i file:

    image

    Scriviamo il codice dell’applicazione Silverlight 3

    Ora, per renderci conto di come usare i RIA Services (un primo modo per la verità), inseriamo una semplice DataGrid nel progetto Silverlight e poi scriviamo il codice seguente nel file di code-behind:

    image

    image

    Se lancio l’applicazione ho i dati visualizzati nelle griglia:

    image

    il metodo LoadCustomers è il corrispondente metodo associato al metodo GetCustomers definito a livello di servizio. I RIA Services usano questa convenzione nella nomenclatura, che comunque può essere personalizzata e/o modificata usando l’attributo [Query] sul metodo del Servizio.

    Nella prossima parte ci occuperemo di:

    • filtraggio, ordinamento, paginazione
    • nuovi controlli RIA
    • validazione
    • operazioni CRUD
  • Pietro Brambati Blog

    Having fun with Windows 7 Sensor API and XNA Game Studio

    • 6 Comments

    One of the coolest features in Windows 7 are the new Sensor (and Location) APIs. The API are native, but you can use them from .NET Framework if you download the Windows API Code Pack 1.0.

    If you would like to test the Sensor API you can do even without a real hardware sensor, in fact in the Windows 7 SDK you can find (both x86 and x64) a Virtual Light Sensor (you can check from this link how to install the Virtual Light Sensor), a simple app that simulate an Ambient Sensor, that, after installed, you can see from Windows 7 sensor’s panel. In the following image you see the app running.

    image 

    1) Buy a sensor

    But if you would like to test a real-hardware sensor, you can buy this one from Freescale. You can see the front and back side in picture taken from my phone:

    mobile 008 mobile 009

    The Freescale’s board has the following sensors:

    • Ambient light sensor
    • 3D accelerometer
    • Dual touch strips

    2) Update the firmware

    To use it with Windows 7 you have to download the Windows 7 Sensor Development Kit from here and update the firmware first, following the readme file. To update the firmware you have first to mount a driver on your system. Tips: to do that, following the instructions, you have to touch the E4 button BEFORE the led display stop says “Press E4 to enter bootloader.”.

    In the following picture I’ve highlighted the led display and the touch E4 Button.. so press the touch button quickly.

    image

    3) Test the sensor with Windows 7

    If you would like to test the 3 sensor on board you can launch the test application (SensorDevKitDiagnosticApp.exe) in the tools\Diagnostic\Binaries Tool directory of the Win 7 Sensor Development kit:

    image

    Ok , now I’ve tested the sensor, but how to have MORE fun ?

    4) Installing XNA Game Studio 3.0

    On codeplex you can download some classes that you can use to extend one of the starter kit that comes with XNA Game Studio … all  in .NET. Because not all the code is implemented , l’ll show you how to minimally do that to drive the car with the accelerometer, of course just for fun and to show how you can use .NET to interact with Windows 7 Sensor API.

    1. Install Microsoft XNA Game Studio 3.0 (62 MB)
    2. Install Microsoft XNA Racing Game Starter Kit (127 MB)
    3. Download Windows 7 Sensor XNA Racing Game (inside you’ll find two classes and a dll).

    Now you can create a simple racing Game Project from Visual Studio 2008:

    image

    After that you have to follow the instruction on the sample from codeplex

    • add the Windows7.SensorAndLocation.dll that contains the wrapper that expose the native API to the .NET world.
    • copy in the Shaders folder, PreScreenSkyCubeMapping.cs (\RacingGame\Shaders\ PreScreenSkyCubeMapping.cs. This file is used to change the light in the sky based on the sensor input
    • In the GameLogic folder, replace Input.cs (\RacingGame\GameLogic\Input.cs) : this file contains all the code used to get the input from different device: mouse, keyboard and with the accelerometer. You can look the Initialize method that initialize the sensor and expose the acceleration in the X and Y axis, as show in the code:

    image

    The code exposes tree properties:

    image

    The first is used to see if an accelerometer is connected and the other two are used to return the real value from the accelerometer. From my test I’ve seen value from –1 o 1.

    Now you have the value returned from accelerometer but how to use in the gaming app ? You first have to initialize the sensor to make the app aware of it, than we have to control the acceleration, deceleration of the car, the left/right turn.

    • go to Graphics\BaseGame.cs in the end of the BaseGame constructor and call the Input.Initialize() that as show before initialize the Accelerometer3D sensor.
    • go to GameLogic\CarPhysics.cs in the Update method you can control the X Axis, for example, value to make the car turn left and right:

    image

    I’ve tried some experiment to correct the sensibility and you can change the 3.0f value to do it yourself.

    To make the car accelerate and go straight or backward  I added this code in the same method:

    image

    Ok probably if you are a XNA Game developer you’ll find a smarter approach to do that, but ok this is another story :-)

    You can download my sample classes from here.

    5) Have fun with Windows 7 Sensor API !

    Now, you can press F5 and play the game with you sensor!

    mobile 011

    6) More on Sensor API.. 

    If you would like to know more about the sensor and location API in Windows 7 and see the video that inspired me to have some fun: watch here.

  • Pietro Brambati Blog

    Creating a Razor Helper for Inline content embedding

    • 3 Comments

    Now that ASP.NET MVC 3 is in RC 2 and after reading some interesting blog posts on Razor’s syntax, I’ve decided to make some experiments building a simple Razor Helper. A helper is basically a snippet of code that you can create to generate some HTML using some code and that you can reuse in different part of your site.

    What this Helper is about

    I want to create an helper that can be used to read content from file system, like a JavaScript file or a CSS file and to insert the content inline in a HTML page. At the end I’ve also created a second helper, to embed also image inline on a HTML tag. If you’re wondering why I need to embed inline Javascript and CSS file in a HTML, the reason for that is to optimize the scenario that a user download a page for the first time of a new visited web site. If your page contains a lot of JavaScripts files and CSS files your browser will probably perform a lot of GETs to retrieve them (the first time you visit a site your browser’s cache is probably empty). So embedding inline code in the HTML page reduce the number of round-trips to get the content and in a single one you can retrive the all code necessary to execute the page. There’re some books that you can read that can give some advice on this scenario and how to optimize the second view to the same site. For  now let me introduce how I’ve built a simple helper, just for fun of building an helper.

    Building and testing the Helper

    To create and test my simple helper I’ve started creating a simple ASP.NET MVC 3 RC 2 project. Then I’ve added an App_Code folder that contains the Razor code. You can also build a library where to put your code, but to be more flexible I’ve followed the simple way. In the same folder I’ve put a file RazorHelpers.cshtml file. This name is important because I’ll use  it to reference the helper in my code.

    image

    Now  I declare some code inside the file: @helper keywork is used to create the helper, and the @funcions keywork to create some internal functions that I’ll call from helper itself. The file looks like the following, where FileGetContent is the function name of the Helper, it’ll be used as a static method.

    image

    I want to use the helper inside the _Layout.cshtml file in the Shared folder. This file is the template for the entire site, and now looks like:

    image

    I want to replace the Link and Script tag with my helper, that will put the code inline in the page and avoid the two query to server for the CSS and JavaScript file. So, the syntax looks like this piece of code:

    image

    The full code of helper is this one:

    image

    The logic of the helper is very simple, the FileGetContent call the function fun_fileGetContent that reads the content from file sytem, using different convention for the beginning of the file name or from the network, checking the common pattern using to express the name of the file, for example starting with http, or  instead with ‘/’ char or ‘~’. Probably I need to add more code to make the helper more robust.

    I’ve also tried to use the helper to add an inline image, so I’d like to have something like:

    image

    where I can literally embed a base64 encoded image inside an HTML img tag with the DataURI schema as in the previous image sample code. For that purpose I’ve created another helper, named FileGetBinaryContent: (I can’t use string encoding for array as in the previous code).

    image

    And now I can use the the code in my Razor View to insert an image of myself (of course, you can use others):

    image

    This is resulting page:

    image

    The page makes a single call and embed a CSS a file JavaScript an Image, but the most important thing of this post is that I’ve build two helpers and used them with the new Razor Syntax.

    If you want to see the full example you can download the code from here.

    Summary

    In this post you have seen that you can create snippet of code that can be reused in different part of your site with a cleaner and compact syntax.

  • Pietro Brambati Blog

    Parliamo di LINQ ...

    • 7 Comments

    Dopo il rilascio della beta 2 di Visual Studio 2008, penso sia giunta l'ora di cominciare a parlare di LINQ anche nel mio blog  e quindi inauguro una nuova categoria.

    LINQ (language integrated query) rappresenta una delle novità più importanti introdotte con il .NET Framework 3.5. In poche parole rappresenta un nuovo modello di programmazione con cui possiamo usare una sintassi "alla SQL", per intenderci, direttamente da C# o da VB.NET. Questa nuova sintassi non si applica solo per interrogazioni eseguite su database relazionali, ma anche alle collezioni di oggetti e all' XML.

    Pensando a VS 2008 è interessante approfondire almeno le seguenti implementazioni di questo modello di programmazione:

    • LINQ to Objects
    • LINQ to XML
    • LINQ to SQL
    • LINQ to DataSet

    LINQ si basa su delle estensioni al linguaggio che rendono possibile implementare lo stesso approccio di programmazione anche verso altre sorgenti dati.

    Vediamo qualche semplice esempio con VS 2008 per capire meglio, partiamo da LINQ to Objects, nei prossimi post mi occuperò delle altre implementazioni. LINQ to SQL ed il supporto offerto da VS 2008 in particolare è sicuramente una degli aspetti più intersessanti e di maggior utilità in molte applicazioni.

    LINQ to Objects

    Creiamo una semplice console application in C# 3.0. Notiamo come prima cosa la presenza di un nuovo namespace System.Linq. Creiamo una semplice array di stringe e poi usiamo LINQ per effettuare un'operazione di filtraggio

    linq1

    Da queste poche righe notiamo alcune cose importanti: abbiamo utilizzato LINQ per filtrare un array di stringhe, nell'esempio è molto chiaro cosa vogliamo ottenere e la sintassi che usiamo assomiglia molto a quella che avremmo usato per fare una query su un database. Nel codice f è una stringa e anche l'IDE di VS lo riconosce come tale.

    linq5

    Notate che f ha il metodo StartWith, normalmente presente per le stringhe e nella figura anch VS la riconosce con l'IntelliSense.

    Una nuova keyword "var" appare nel codice in C#. Grazie all'uso di var il compilatore stabilisce il tipo della variabile a partire dalla sua dichiarazione. Quindi la variabile nell'esempio è una stringa. Allo stesso modo scrivendo "var i = 1; var b = true;" il compilatore è in grado di inferire che la variabile i è un intero e che b è di tipo boolean.

    L'output del nostro programma è quello che ci aspettiamo la variabile fruttiPreferiti contiene le due stringhe che iniziano con la lettera "m", cioè mela e mandarino.

    Avremmo potuto utilizzare non solo stringhe ma anche dei tipi custom, come ad esempio una lista di clienti e effetuare altre operazioni utilizzando altri operatori standard di LINQ, si veda ad esempio il seguente codice:

    linq4

    Nell'esempio di codice sopra riportato si vuole ottenenere la lista dei clienti odinati in modo discendente di sola nazionalità italiana.

    Notiamo alcune cose interessanti: nella classe cliente le proprietà sono dichiarate con una sintassi semplificata. Anche questa è una delle novità introdotta dal C# 3.0. Comoda vero?

    Nella creazione della lista clienti i nuovi clienti sono creati e allo stesso tempo sono inizializzate le proprietà Nome e Nazione. Questo nuovo costrutto del linguaggio viene chiamato Object Initializer. Notate che la classe Cliente, non ha costruttori a cui passare i due parametri per inizializzare le proprietà. 

    Infine ho utilizzato due nuovi operatori orderby e descending, il cui significato mi sembra scontato.  Alla fine ecco l'output della nostra applicazione:

    image

     Usiamo VB.NET

    Fino ad ora abbiamo scritto il codice utilizzando C# ed in particolare il C# 3.0 con alcune delle nuove estensioni al linguaggio, come la keywork var, la generazione automatica delle proprietà e l'Object Initializer. Tuttavia anche VB.NET mette a disposizione le stesse estensione e altre nel nuovo VB.NET 9.0.

    Ecco un esempio:

    image

    Da notare:

    La classe Person non ha costruttori. Abbiamo creato una lista di people ed abbiamo usato anche in questo caso l'Object Initializer per creare istanze delle classe e inizializzare le relative proprietà, notate l'uso delle parentesi graffe.

    Anche in questo caso il compilatore è in grado di inferire il tipo diteeagers e di teen usato nel ciclo For Each.

    Ecco infinre l'output:

    image

    Da dove partire ...

    Spero di avere stimolato la curiosità di chi si avvicina per la prima volta a LINQ. Per chi vuole cominciare a fare qualche prova consiglio questo percorso:

    1. Scaricare la beta 2 di Visual Studio 2008
    2. Laboratori di Linq in C#
    3. Laboratori di Linq in VB.NET

     

    Qualche link utile

    The LINQ Project

    Esempi VS08 Beta 2, anche HOL (laboratori) su LINQ

    C# 3.0 Language Specification

     

    Interessante vero? Ai prossimi post su LINQ.

    -Pietro

  • Pietro Brambati Blog

    Silverlight 4 e WCF RIA Services : esempio di relazione master-detail

    • 4 Comments

    [Aggiornato con codice anche in Visual Basic]

    In questo post vedremo come realizzare un semplice esempio per implementare una relatione master-detail usando Silverlight 4 e i WCF RIA Services, entrambe le tecnologie non ancora rilasciate.

    Per realizzare l’esempio dovete installare

    • Visual Studio 2010 (beta 2 al momento)
    • Silverlight 4 (beta) che contiene la Technical Preview dei WCF RIA Serives

    Creazione del progetto per una Business Application

    Inzialmente partiamo realizzando un’applicazione Silverlight, anche se non strettamente necessario possiamo usare il template Silverlight per realizzare applicazioni di business. Per usarlo da Visual Studio 2010, selezionare “New Projects”, quindi “Silverlight” e selezionare Silverlight Business Application, come mostrato in figura

    image

    Questo template ci consente di avere un template già fatto che offre questi vantaggi:

    • aspetto professionale
    • un framework di navigazione per l’applicazione integrato con i bottoni di back and forward funzionante da diversi browser: Internet Explorer, Safari, FireFox e Chrome.
    • Proprietà dei controlli della UI già integrati con il file delle risorse per una facile localizzazione
    • integrazione con il provider di memership di ASP.NET per l’autenticazione e gestione dei ruoli

    Nel nostro caso andremo a personalizzare la pagina Home.xaml che si trova nel folder Views, ma potete aggiungere un’altra pagina Silverlight facilmente al framework di navigazione.

    Creazione del DAL usando Entity Framework

    Aggiungiamo ora al progetto un ADO.NET Entity Data Model, per creare il nostro DAL, nel mio caso l’ho chiamato NorthwindModel.edmx e ho aggiunto, usando il database northwind, la tabella Customers e Orders, per avere una semplice relazione 1-a-molti che mi servirà per creare la UI con la relazione master-details. Inoltre nel designer ho rinominato le due classi create togleindo la “s” finale. Quindi il mio modello dei dati avrà la classe Customer e la classe Order, senza “s” . Quersto mi permette di avere collezioni di oggetti che invece avranno la “s” finale. Ovviamente questa è una finezza e non strettamente necessaria.

    Nella figura seguente vedete la selezione delle due tabelle dal designer di Entity Framework

    image

    Che generano quindi le due classi. Nella figura seguente vedete il risultato con le due entità già rinominate.

    image 

    Creazione del servizio con i WCF RIA Services

    Aggiungiamo ora un nuovo item che realizzerà lo strato di servizio con i RIA Services. Add-> New Items… e selezioniamo il template per Domain Service Class.

    image

    Questo mostrerà un popup nel quale dobbiamo indicare se le entità che verrano create saranno accedibili dal client, quali entità di quelle presenti vogliamo utilizzare, se vogliamo fare operazioni di modifica, oltre che di lettura.

    image

    Questo wizard genera il file NorthwindDomainService.cs dove troviamo il codice del servizio e in particolare i metodi per ottenere la lista dei nostri Customer come GetCustomers che ritorna un valore di tipo IQueryable del tipo Customer. In questo caso l’implementazione del nostro servizio è fatta sfruttando la classe LinqToEntityDomainServices messa a disposizione dal framework e che Visual Studio 2010 mi consente di sfruttare a pieno tramite il wizard.

    image

    Dato che ho chiesto al wizard di utilizzare anche l’entità Order, nel progetto troverete anche i corrispondenti metodi per la gestione.

    Nel nostro caso però lo scenario che vogliamo indirizzare è leggermente più complesso: infatti vogliamo mostrare due griglie la prima legata ai clienti e la seconda agli ordini di uno specifico cliente una volta selezionato questo nella prima griglia.

    Per questo aggiungiamo un metodo per recuperare gli ordini, metodo che accetterà un parametroche rappresenta l’id del nostro customer.

    image 

    il codice da aggiungere per chi usa Visual Basic.NET 2010 è il seguente

    image


    Grazie ai RIA Service e il template di progetto di Visual Studio 2010 ci troviamo, dopo la compilazione, il modello ad oggetti esposto sul server, direttamente sul client e tutte le operazioni di comunicazione vengono gestite per me dal framework.

    Creazione della User Interface

    Per la UI ho posizionato due DataGrid, una (customerDataGrid) che conterrà la lista dei customer e la seconda (orderDataGrid) gli ordini selezionati per lo specifico customer. Per fare questo ho intercettato l’evento SelectionChanged sulla prima DataGrid, per aggiungere del codice in cs, come vedrete nel seguito.

    Inizialmente ho usato il drag-and-drop offerto da Visual Studio 2010, usando la finestra Data Source e trascinando l’oggetto Customer, questo mi ha aggiunto sia la DataGrid che l’oggetto DomainDataSource corrispondente. Inoltre ho poi aggiunto una seconda DataGrid che dovrà contenere gli ordini.

    In figura seguente vedete più o meno il risultato nel designer di Visual Studio 2010:

    image

    Aggiungo ora l’evento SelectionChanged alla DataGrid customerDataGrid e aggiungo il codice per riempire la seconda (orderDataGrid nell’esempio) facendo la query verso il metodo GetOrdersByCustomerID, visto prima, aggiunto lato server e che mi trovo ora sul client grazie a RIA Services. Il metodo lato client, si chiama come la sua controparte sul server, con in più l’estensione finale di Query.

    image 

    Il codice in Visual Basic corrispondente è:

    image

    Lanciando ora l’applicazione abbiamo il comportamento desiderato: seleziono un customer nella prima DataGrid e vedo nella seconda gli ordini, come vedete nella figura sottostante.

    image

    Download esempio

    Potete scaricare il codice d’esempio da

    Buon divertimento con Silverlight 4 e i WCF RIA Services !

  • Pietro Brambati Blog

    Windows Communication Foundation (WCF) ... qualche web-pillola

    • 5 Comments

    Sì, spero di fare cosa gradita iniziando una serire di "web-pillole" su quest' argomento. Nel post trovate riferimenti alle pagine della documentazione ufficiale, dove trovare approfondimenti. Iniziamo con la prima e fatemi sapere se volete che ne scriva altre sull'argomento. 

    Windows Communication Foundation, WCF per gli amici, è una delle novità introdotte da .NET Framework 3.0, rilasciato con Windows Vista. Come penso sapete le altre componenti del .NET Framework 3.0 sono Windows Presentation Foundation (WPF), Windows Workflow Foundation (WF) e Windows CardSpace (WCS). Il runtime del .NET Framework 3.0 è anche disponibile per Windows XP SP2 e Windows 2003 SP1 .

    Quindi in estrema sintesi .NET 3.0 = WCF + WF + WPF + WCS. Se volete qualche informazione in più potete scaricare qualcuna delle mie vecchie presentazioni qui.

    WCF è nato con almeno i seguenti obiettivi:

    Soffermiamoci sull'ultimo punto: fino a prima di WCF, eravamo abituati a usare diversi modi di programmare, per modi intendo API e modelli di programmazione: diverso è se dobbiamo creare un'applicazione che usa .NET Remoting, Web Services, Enterprice Services, COM+ o MSMQ; questo per diverse ragioni: basti pensare che molte di queste tecnologie sono nate in momenti storici diversi. Con WCF possiamo usare un unico modello di programmazione quello di WCF e utilizzare tutti i paradigmi di programmazione prima menzionati. Tanto per fare un esempio pensiamo di scrivere con WCF un servizio, che implementa semplici funzionalità di somma, sottrazione etc. Vedremo meglio tra breve, cosa si intende per servizio, e di "esporlo" come un Web Service via http. La cosa interessante di WCF e del suo modello di programmazione e che fatto tale servizio, cambiando semplicemente i file di configurazione del client e del server, potremmo ad esempio esporre il nostro servizio,via HTTP come Web Service, ma anche via TCP/IP. In uno scenario in cui vogliamo usare i Web Service per offrire interoperabilità tra piattaforme diverse, magari esterne alla nostra azienda, e offrire al tempo stesso maggiori performance ai client che sono interni al nostro dominio aziendale WCF è sicuramente di aiuto. Con WCF il nostro servizio, sarà implementato una volta, ma il "contenitore" del servizio, lo esporrà usando due distinti trasporti. Attenzione ho detto contenitore, non ho parlato solo di IIS, ma ritornerò presto su questo.

    Quindi usiamo WCF per realizzare applicazioni distribuite, usando un paradigma di programmazione serviced-oriented.

    Ok, capito questo, vediamo come addentrarci in WCF, introducendo i concetti di EndPoint, Address, Binding e Contract. Farò riferimento, anche in seguito, agli esempi che trovate nell' SDK di Windows, che sono scaricabili anche separatamente come samples per WCF e WCS qui.

    In generale abbiamo un Client ed un Server, che comunicano usando dei messaggi: ricordate si parlava di architetture SOA … per fissare le idee, inizialmente, ma solo inizialmente, pensate a quello che sappiamo dal mondo dei Web Service.

    L'Host, cioè chi contiene il nostro servizio (e.g. libreria matematica che espone funzioni base ), lo espone  attraverso quello che viene definito come Endpoint. Endpoint = Address+Binding+ Contract (detti l'ABC di WCF!). E il client ? Anche quest'ultimo parlerà con il servizio in questione usando lo stesso Endponit. In breve:

    • Contract: interfaccia del servizio che vogliamo rendere fruibile. (Cosa posso fare?)
    • Binding: è fatto da più elementi, detti binding elements, che rappresentano il tipo di trasporto utilizzato, ad esempio TCP/IP, più altre funzionalità più specifiche che riguardano ad esempio la sicurezza, la possibilità di supportare una sessione condivisa tra client e server o il sistema di codifica utilizzato. (Come comunicare con il servizio?)
    • Address: è l'indirizzo, condiviso tra client e server per la comunicazione, specificato usando un URI, che identifica anche il trasporto usato. Ad esempio HTTP://cohowinery:8005/ServiceModelSamples/CalculatorService. (Dove posso trovare il servizio ?)

    Nell'immagine seguente è espressa una vista di insieme, spero chiara:

    SnagIt   

    Aggiungo un'importantissima considerazione: il contenitore del servizio, come l'ho definito fin'ora, l' host può essere non solo IIS, ma anche una console application, una Windows Form, un pacchetto COM+, un'applicazione WPF etc.  

    Nella figura il nostro servizio espone l'interfaccia ICalc che viene utilizzata per definire il contratto, tale contratto è utilizzato per definire due Endpoint, uno che usa un binding che internamente usa come trasporto TCP/IP e un secondo che usa come trasporto HTTP e che permette di esporre il servizio come Web Service. In entrambi i casi sono definiti due Address distinti che devono essere conosciuti dai client. I client infatti usano WCF e usano i due distinti endpoint. Il client che consuma il servizio esposto come Web Service potrebbe essere anche un client non-WCF, ad esempio un'applicazione Java su altra piattaforma.

    Nel prossimo post vedremo un esempio di codice sia di un client che un servizio.

    A questo link trovate il sito community sul .NET 3.0 e in particolare su WCF: trovate esempi, blog, etc. Interessante la sezione resources con articoli interessati. 

    Buona lettura e fatemi sapere ..

    -Pietro

  • Pietro Brambati Blog

    Parliamo di LINQ - parte 2

    • 3 Comments

    LINQ rappresenta una delle novità più importanti per lo sviluppo nella prossima release di Visual Studio.

    LINQ è una serie di estensioni al linguaggio, sia per C# che VB.NET, che ci permettono di utilizzare una serie di operatori "alla SQL" per lavorare su diverse sorgenti dati.

    Nel primo post di questa serie ho parlato di LINQ to Objects. Vediamo ora un' introduzione a LINQ to XML con C# e VB.NET.

     

    LINQ to XML

    Linq to XML è l'implementazione delle estensioni al linguaggio che consentono di lavorare con l'XML. Con Linq to XML possiamo creare strutture e documenti in XML in memoria e utilizzare una sintassi per l'interrogazione e la modifica delle stesse.

    Creiamo un file XML

    Creiamo una console application con Visual Studio 2008 beta 2 ed aggiungiamo il seguente namespace using System.Xml.Linq; quindi scriviamo il codice in figura:

    C#:

    image

    Mi sembra abbastanza chiaro cosa si vuole ottenere, notate l'uso delle nuove API XDocument, XDeclaretion, XElement e XAttribute. L'uso è abbastanza intuitivo.

    La stessa operazione può essere fatta anche in VB.NET, ma con una sintassi diversa che ne rende ancora più semplice l'uso.

    VB.NET:

    image

    Questa sintassi è particolare ed è unica in VB.NET, non è ammessa in C# e consente di definre in-line un frammento di XML. In VB.NET avrei potuto anche usare la sintassi equivalente a quella usata in C#, come ad esempio

    image

    Il risultato sarà comunque lo stesso: in tutti i casi un file XML che contiene:

    image

    Query sul file

    Ok, ora possiamo usare Linq per fare delle query sul file:

    C#:

    image

    Dopo aver caricato il file in un XDocument, prendiamo i nodi che sono al di sotto del tag <Clienti>, quindi i vari <Cliente>. Utilizziamo i due nodi di <nome> e <cognome> per creare un nuovo tipo, anonimo,  che contiene il valore dei due nodi dell' XML.

    Così otteniamo, avendo inserito un altro cliente nel file:

    image

    Potremmo anche utilizzare altri operatori Linq come "where" per filtrare ulteriormente la query, come ad esempio:

    image

    con cui otteniamo il cliente con attributo id uguale a C02.

    VB.NET

    Con VB.NET possiamo scrivere:

    image

    Anche in questo caso ho usato una sintassi che contiene dell XML in-line nel codice, ma avrei potuto scrivere in modo equivalente alla sintassi usata in C#:

    image

    Ora che abbiamo visto come eseguire una semplice query usando LINQ, vediamo come a partire dal risultato ottenuto possiamo creare un un nuvo file XML, con una struttura diversa.

    Supponiamo che il nostro cliente, sia diventato impiegato della nostra azienda:-) Ok, non proprio uno scenario comune, ma ci interessa solo per poter usare la query fatta in precedenza per creare un nuovo file XML con struttura diversa.

    C#:

    image

    Nell'esempio in verde vedete evidenziate le API, che abbiamo usato in precedenza per creare un file, che in questo caso usano dei valori che arrivano da una query fatta con Linq, in giallo.

    VB.NET

    In VB usiamo ancora una volta la sintassi in-line per creare il nuovo XML e usiamo una query Linq per inserire i valori.

    image

    Il nuovo XML può essere ovviamente salvato come fatto in precedenza, ma in questo caso ci limitiamo a vederne il risulato in una console appllication:

    image

    Concludendo

    In questo secondo post su Linq abbiamo visto come utilizzare delle nuove API (X*) per creare strutture XML e come poterle poi agevolmente salvare in un file. Linq ci ha aiutato ad interrogare le strutture XML in modo semplice ed intuitivo, per chi ha un po' di familiarità con il linguaggio SQL. Queste due caratteristiche le abbiamo poi combinate per realizzare una nuova struttura in XML i cui valori sono stati presi da una query Linq fatta sul altri dati.

    Infine abbiamo visto come programmare sia in C# e in VB.NET e ho mostrato come struttare le novità in VB per poter interagire con XML in-line nell'editor di Visual Studio 2008.

    Se mi avete seguito passo-passo, con una versione di Visual Studio 2008 beta 2, vi sarete accorti che la scrittura del codice è stata facilitata dall' IntelliSense. Questo anche in virtù del fatto che il codice scritto e completamente Strong-Typed, come ho già fatto notare nel post precedente, e le keywork var e Dim usate permettono al compilatore di inferire il tipo della varibile dichiarata.

    Per chi non ha seguito passo-passo consiglio il seguente percorso con laboratori:

    1. Scaricare la beta 2 di Visual Studio 2008
    2. Laboratori di Linq in C#
    3. Laboratori di Linq in VB.NET

     

    Ciao e alla prossima.

    -Pietro

  • Pietro Brambati Blog

    LINQ to SQL - Parte I

    • 9 Comments

    LINQ rappresenta una delle novità più importanti per lo sviluppo nella prossima release di Visual Studio.

    LINQ è una serie di estensioni al linguaggio, sia per C# che VB.NET, che ci permettono di utilizzare degli operatori "alla SQL" per lavorare su diverse sorgenti dati.

    Questa è la terza parte di una serie di post. Negli altri post ho affrontato i segueti argomenti:

    Ora vi racconto l'implementazione di Linq più interessante: LINQ to SQL. LINQ to SQL ed il designer di Visual Studio 2008 sono pensati per reallizzare applicazioni che usano SQL Server come database. Il designer genera molto del codice che fare a mano sarebbe tedioso, ma al contempo ci lascia la possibilità di intervenire con soluzioni più mirate, dandoci la possibilità di cambiare o estendere il codice generato.

    LINQ to SQL

    Linq to SQL vi permette di utilizzare la sintassi vista in precedenza per interrogare SQL Server, la query espressa verrà poi convertita in una chiamata ADO.NET. Visual Studio 2008 mette a disposizione nell' IDE  un designer che ci aiuta, a partire da un database SQL Server esistente, a mappare le tabelle alle classi che useremo nella nostra applicazione.

    Configuriamo Northwind

    Negli esempi seguenti userò come database  il famosissimo Northwind, che potete scaricare qui.  Come DBMS ho usato SQL Server 2005 Express Edition SP2, che potete scaricare gratuitamente; allo stesso link potete trovare anche la SQL Server Management Studio Express, l'applicazione client per l'amminstrazione.

    Aggiungiamo il database Northwind alla lista di quelli gestiti da SQL Server Express. Apriamo la console di SQL Server Management Studio Express.

    image

    Tasto destro su Databases, quindi Attach, appare la schermata sopra in figura, dove possiamo aggiungere il file Northwnd.MDF: premere il tasto Add ... e quindi scegliere la directory in cui è copiato il file.

    Alla fine il nostro database verrà aggiunto alla lista di quelli gestiti. Chiudiamo il Management Studio.

    Creiamo l'applicazione di test con Visual Studio 2008 ed usiamo il designer

    Creiamo ora una console application con Visual Studio 2008, in VB.NET o in C#.  Aggiungiamo alla lista delle connessioni in Visual Studio quella al database Northwind che verrà visualizzata nel Server Explorer (per visualizzarlo View -> Server Explorer). Quindi premendo il bottone "connect to database" possiamo visualizzare direttamente da Visual Studio il nostro database e avere accesso agli elementi che lo costituiscono: tabelle, store procedues, viste etc.

    image

    Per accedere al Designer che ci consente di effettuare il mappaggio delle tabelle alle classi aggiungiamo un nuovo item, tra la lista dei templates troviamo LINQ to SQL Classes come mostrato in figura.

    linq2_thumb[4]

    Una volta rinominato il file in Northwnd.dbml e aggiunto al progetto, l' IDE di VS 2008 ci dà la possibilità di fare il drag-and-drop delle tabelle del database al fine di costruire le classi ad esse associate. Così in figura ho fatto il drag-and-drop delle tabelle Products, Categories, Orders, Customers che hanno generato le relative classi Product, Category, Order e Customer.

    image

    Se diamo un'occhiata ai file del nostro progetto vedrete che sono stati aggiunti tre file, se aprite il file Northwind.designer.cs potete notare che cosa ha creato il designer di Visual Studio.

    Vi faccio notare che è stata generata una classe NorthwindDataContext che deriva dalla classe DataContex. Come vedrete a breve la query che faremo sul database sarà sullo stile di quelle viste con Linq To XML e Linq to Objects. La classe DataContext ha la funzione di "mascherare" la connessione verso il database e di rendere possibili le operazioni di aggiornamento verso il database. Ogni tabella del nostro database sarà accedibile come proprietà pubblica di questa classe e sarà, a sua volta, una classe di tipo Table. Ad esempio ci sarà la possibilità di accedere alla classe Products che è di tipo Table<Product>. La classe Product viene descritta nel prossimo paragrafo. In breve quindi la classe DataContext è l'entry point per poter utilizzare Linq To SQL.

    Come funziona il mapping del designer tra il database e le classi ?

    Sempre all'interno del file generato trovate una serie di attributi che specificano il mappaggio con il database, le tabelle e le classi.  La classe NorthwindDataContext viene mappato sul database Northwind. 

    image

    La classe Product viene  mappata sulla tabella Products.

    image

    All'interno della classe Product la proprietà ProductID viene mappata sulla corrispondente colonna della tabella del db e vengono inoltre indicate altre caratteristiche: ad esempio che è un chiave primaria ed il tipo che la rappresenta nello schema del db. L'attributo AutoSync stabilisce che relazione di sincronizzazione ci deve essere tra la proprietà dell'oggetto e la row del db. Nel nostro caso la proprietà dell'oggetto viene valorizzato quando un prodotto viene effettivamente inserito nel database, notate che sul database la colonna è una IDENTITY. Qui il dettaglio sull'attributo Column.

    image

    Il mappaggio che abbiamo visto si basa sul fatto che le classi della nostra applicazione ad esempio Products, che useremo con LINQ, sono mappate tramite una serie di attributi al nostro database. Questa non è l'unica soluzione adottabile: è infatti possibile disaccopiare la classe dall'attributo che la mappa sul database e usare un file XML per effettuare tale mappaggio, ma questo sarà un argomento di un altro post ...Per chi vuole subito informazioni su come costruire il proprio modello ad oggetti con Linq To SQL, segua il link.

    Una semplice query ...

    Vogliamo ora ottenere il nome dei prodotti della categoria "Beverages", scriviamo quindi:

    C#:

    image

    Cosa c'è da notare?:

    Ho aggiunto il namespace a System.Data.Linq; per utilizzare le estensioni al linguaggio per Linq To SQL

    Notatate che p è di tipo Products, cioè una classe con un tipo ben preciso, quello che abbiamo visto nei paragrafi sul mappaggio, inoltre da p posso accedere non solo alla proprietà Category, ma anche al nome della categoria stessa! Se andiamo a vedere la tabella Products sul database ci accorgiamo che contiene solo la colonna CategoryID che in relazione con la chiave primaria della tabella Categories. E' proprio in questa tabella che si trova la colonna CategoryName.

    image

    L'output dell'applicazione è il seguente: la lista dei prodotti della categoria cercata:

    image

    in VB.NET:

    image

    la cui logica è equivalente a quella vista in precedenza.

    Che codice SQL viene generato e quando ?

    Penso di prevedere una vostra domanda, anzi due.

    Per vedere il codice generato, inseriamo la seguente riga di codice e rieseguiamo l'applicazione:

    image

    Come vediamo ora nella console application viene mostrato il codice SQL che viene eseguito in SQL Server:

    image

    Come vedete viene eseguita una prima chiamata SELECT in LEFT OUTER JOIN tra la tabella Products e la tabella Categories, questo perchè è solo in quest'ultima tabella che troviamo il nome della categoria. Ricordate quanto è stato semplice con Linq scrivere p.Category.CategoryName, senza preoccuparci del Join tra le tabelle. Il modello ad oggetti offerto forniva già la possibilità di navigare in relazioni 1 a molti. La seconda query è stata generata perchè abbiamo voluto avere il nome della categoria nel ciclo for each. Operazione che certamente potevamo evitare, almeno in questo semplice esempio.  

    Quando viene eseguita la query sul database? Se mettiamo un break-point (F9) sul cliclo foreach nell'esempio di codice, potremmo essere sorpresi di una cosa. Se guardiamo infatti la console application non vediamo ancora visualizzato il codice di esecuzione su SQL. Questo perchè non è ancora stato eseguito! Infatti nostante ci potremmo aspettare che il codice Linq viene immediatamente tradotto in codice SQL standard, non è così. Premiamo F10 un po' divolte e ci accorgiamo che il codice viene eseguito quando serve, cioè durante l'enumerazione del ciclo. Linq utilizza un modello di esecuzione differtita (deferred execution). Questo perchè LINQ analizza le operazioni che fino a quel momento sono state eseguite prima di comporre la query. In certi scenari questo comportamento è sicuramente desiderabile, in altri sarebbe desiderabile l'opposto. E quindi possibile eseguire la query una volta e riutilizzarla successivamente. Per fare questo è sufficiente convertire il risultato della query in una collezione standard usando gli operatori ToList() o ToArray().

    In breve ...

    In questo primo post abbiamo visto come, in pochi semplici passi, possiamo trarre beneficio da Linq to SQL e dal O/R (Object Relational) Designer di VS 2008. L'uso di quest'ultimo è sicuramente di aiuto nello sviluppo di applicazioni RAD e in alcuni scenari non riechiede di scrivere codice ulteriore a quello già generato. Tuttavia nei prossimi post vedremo come personalizzare il codice gerato per adattarlo agli scenari di altri tipi di applicazioni.

    Linq to SQL ci consente di accedere ai dati in modo diverso da quello fatto tradizionalmente con ADO.NET, realizzando uno strato di software per l'accesso ai dati, che ci consente di mappare uno a uno classi e tabelle di un database SQL e di lavorare a livello applicativo concentrandoci solo sugli oggetti senza preoccuparci troppo della struttura del nostro database SQL Server.

    Nelle prossime "puntate":

    Nei prossimi post vedremo come fare operazioni di scrittura sul database e come estendere e modificare il codice generato in automatico.

    Link utili:

    In questo articolo LINQ to SQL viene presentato in modo chiaro e completo.

    LINQ to SQL: .NET Language-Integrated Query for Relational Data (articolo MSDN in inglese)

    Percorso:

    Per chi non ha seguito passo-passo consiglio il seguente percorso con laboratori:

    1. Scaricare la beta 2 di Visual Studio 2008
    2. Laboratori di Linq in C#
    3. Laboratori di Linq in VB.NET

    Ciao e alla prossima.

    -Pietro

  • Pietro Brambati Blog

    How to localize The Title in a WP7 Silverlight application

    • 4 Comments

    If you’re working on a Silverlight application for WP7 and you want to localize non only the resources  inside the application, but also the Title name of your application you could find some useful information on this post that make your app easily uploaded and certified on the App Hub (the marketplace).

    The result of you localization process will be as the following, in the emulator (you can test this on it) you’ll see the same app using different names for English, Italian, French, Spanish and German.

    In the following pictures you can see the difference, switching between  English and Italian.

    imageimage

    imageimage

    To switch, you have to go in settings menu of your emulator (or device) and change the language and than tap to screen to reboot it using the new configuration.

    How to localize

    Basically to localize the Title you have to create a resource-only project for the following languages in C++, build and add the assemblies to the root of you Silverlight project. To do this you have to use Visual C++ compiler (unfortunately the Visual C++ Express can’t be used, but if haven’t  a full copy of Visual Studio 2010 you can download a trial).

    I’ve create a simple Silverlight project and the resource-only C++ projects that you can download and easily personalize.

    You can see in following picture how it looks like:

    image

    The WP7SilverlightLocalizedSample depends on some C++ projects. You hadn’t to rename the C++, projects, they must be named exactly as they are, instead you can add you personal Silverlight project to the Solution.

    Every C++ project have some post-built rules that copy the resource assemblies in the root of the solution. In the Silverlight project I have “add a link” to the generated assemblies and I’ve set the properties for these seven files as “Content” in the Build Actions.

    If you now want to localize the names of your application in different languages, first start from the AppResLib, and right-click on the AppResLib.rc file , than view code, and you’ll enter in the resource file.

    The AppResLib is the assembly for the language-neutral.

    image

    In the resource file you can search for the two string “AppTitle” and “AppTileString” and change them as you prefer.

    image

    You have to do the same stuff for other assemblies:

    • AppRes0407 for German
    • AppRes0409 for English - United States
    • AppRes040c for French
    • AppRes0410 for Italy
    • AppRes0809 for English – UK
    • AppRes0c0a for Spanish

    How to setup the Silverlight Project

    Now that you have localized the resource-only assemblies you have to change the WMAppManifest.xml , that you probably have on the properties folder and change the two strings as in the following pictures:

    image

    So you have to put in App element the Title attribute as

    @AppResLib.dll,-100

    and the Title element in the TemplateType5 as

    @AppResLib.dll,-200

    and you’ve done!

    Conclusion

    If you want to localize the title of your Silverlight app for the marketplace you can use the sample I provided, if you’re using XNA for building game you can see the detailed Aaron Stebner’s post from here.

    Happy coding with Windows Phone 7.

  • Pietro Brambati Blog

    LINQ, LINQ to SQL e ADO.NET Entity Framework

    • 3 Comments

    Si è appena concluso l'evento di Lancio a Perugia con i ragazzi di .NetUmbria, grazie a  tutti per i feedback ricevuti, ecco un breve sunto della sessione, con qualche link utile ...spero.

    LINQ to *

    Una delle novità più impotanti di .NET Framework 3.5 è sicuramente LINQ. Con Language Integrated Query abbiamo a disposizione una "sintassi alla SQL" per accedere a diverse sorgenti dati: collezioni di oggetti, nodi XML, DataSet e SQL Server, permettendo di lavorare utilizzando un approccio dichiarativo invece che imperativo. Questo ci consente di esprime ciò che vogliamo nel nostro codice in modo più semplice e leggibile, in molte situazioni.

    La mia presentazione non è stata proprio introduttiva sull'argomento e per chi vuole saperne di più sulle novità ai Linguaggi C# 3.0, VB 9, o vuole avere una panoramica un po' più ampia sull'argomento consiglio di iniziare da questo tutorial scaricabile su LINQ e le novità dei linguaggi .NET.  Durante la sessione mi sono concentrato di più su LINQ to SQL e ho introdotto l'ADO.NET Entity Framework cercando di chiarirne gli obbiettivi e di metterne in eveidenza le potenzialità d'utilizzo, nonchè di far capire che relazione esiste con LINQ to Entities.

    LINQ to SQL

    Linq to SQL è l' implementazione LINQ per SQL Server, e solo per SQL Server. E' possibile utilizzare LINQ sia per interrogare SQL Server che per effettuare operazioni di aggiornamento/inserimento e modifica. Il linguaggio usato da LINQ to SQL è sicuramente molto espressivo, tanto che non è possibile avere una query T-SQL non esprimibile con LINQ to SQL. Per essere ancora più chiari, tenete presente che le query generate dall'engine sono state fatte dal team di prodotto di SQL Server.  Da un certo punto di vista LINQ to SQL è anche più potente del T-SQL, permettendo di scrivere  query come quella mostrata nell' esempio:

    image

    In cui possiamo chiedere la lista di clienti della città London e, tra questi, solo quelli che hanno un numero di ordini superiori a 4. Nel tipo anonimo ritornato una delle due proprietà è una lista di particolari ordini per quel cliente. Questa query LINQ, tutto sommato comprensibile, genera del codice SQL più complesso, con tanto di LEFT OUTER JOIN.

    image

    LINQ to SQL e Store Procedure - Insert/Update/Delete

    Una delle domande che più spesso ricevo è se si possono usare le store procedure con LINQ to SQL. La risposta è sì e con pieno supporto del designer. Ad esempio posso modificare il comportamento di quello che viene definito come "Behaviour" delle classi generate per fare in modo di andare ad inserire le mie logiche di Insert/Update/Delete. Nell'immagine vedete come selezionare una classe generata dal Designer di Visual Studio e come sia possibile mappare sull'operazione di Update di LINQ to SQL il comportamento di una Store Procedure. Prima dobbiamo avere associato (facendo drag-&-drop) delle store procedure al designer di Visual Studio (nel mio caso la StoreProcedure UpdateOrder): questo genera dietro le quinte il codice necessario per eseguire la chiamata alla store procedure.

    E' da notare che il modificare il comportamento di LINQ to SQL per dirgli di utilizzare una store procedure per effettuare un'operazione di update non ha impatto sul codice che scriveremmo nell'applicazione per creare un ordine, aggiungere l'ordine alla collezione degli ordini del cliente e così via: ho omesso questo codice nelle figure seguenti, dove si vedere solo come dire alle classi di LINQ to SQL di utilizzare una store procedure invece di utilizzare il codice generato dal run-time stesso. Spero di essere stato sufficentemente chiaro.

    image

    image

    LINQ to SQL  Store Precedure & TVF

    E se ho una store procedure che recupera dati, anzichè fare insert/update o delete ? Certo la posso utilizzare ad  esempio posso richiamare una store procedure che recupera i clienti per città e utilizzarla dalla classe DataContext specializzata. Quindi posso scrivere:

    image

    Dove db è sempre il Data Context specializzato, mentre il metodo va a richiamare una store procedure su database.

    Ora, dato che la store procedure recupera una lista di clienti, mi potrebbe venire in mente di effettuare un'operazione di filtraggio (con una where) sul risultato. Quello che succede è che il filtraggio viene però eseguito in memoria, cioè se scrivo:

    image

    Quello che vediamo su SQL Server è solo l'esecuzione della store procedure, il risultato del nostro codice è però quello atteso: non solo ho clienti della città prescelta, ma ho filtrato in base a quelli il cui contactname inizia per "B", operazione quest'ultima effettuata in memoria.

    LINQ to SQL supporta anche l'uso delle Table-Value Function (TVF), che, grazie alla loro componibilità, offrono invece un meccanismo diverso. Avendo una TVF nel db che fa le stesse operazioni che fa la store procedure, questa volta se richiamo la mia TVF e filtro come in precedenza:

    image

    Notate che nell'ultimo esempio sto chiamando un metodo diverso dal precedente, che appunto si mappa su una TVF su db.Questa volta il codice che viene eseguito su SQL Server contiene anche l'operazione di filtraggio, come vedete nella seguente immagine in cui viene appunto mostrato il codice SQL che SQL Server genera

    image 

    ADO.NET Entity Framework (EF) e LINQ to Entities

    Nella presentazione ho anche introdotto l' ADO.NET Entity Framework (EF). Ci tengo a ricordare che EF e Linq To Entities non sono stati rilasciati con Visual Studio, ma sono in beta attualmente.

    L'idea di base di EF è di aumentare il livello di astrazione con cui lavoriamo nelle applicazioni. Cioè possiamo modellare delle classi che non si mappano a priori in modo diretto su una tabella di un database. Ad esempio la mia entità customer può poi mapparsi su n tabelle del mio database. Un' altra importante caratteristica di EF è che è pensato per poter essere utilizzato con diversi database. Nella slide seguente trovate l'architettura di EF in cui si evincono almeno le seguenti caratteristiche:

    • è stato implementato un nuvo provider EntityClient che si appoggia sul meccanismo a provider di ADO.NET 2.0
    • per "parlare" con EF  esiste un linguaggio  Entity SQL, che è espresso per mezzo di una stringa, ma che mi permette di lavorare con Entità e non con tabelle.
    • LINQ to Entities è una implementazione di LINQ per lavorare con EF (sia lettura, che scrittura)

    image

    Ok, lungi dal voler essere completo in questo post qui trovate descritto l'esempio della sessione in cui potete vedere come ho modelli ad oggetti diversi se lavoro con LINQ to SQL rispetto a se lavoro con LINQ to Entities su un database comune di riferimento.

    Quando usare LINQ to SQL e quando usare LINQ to Entities ?

    LINQ to SQL è pensato per essere il modo più rapido per accedere a SQL Server e in scenari in cui il nostro modello ad oggetti si mappa 1:1 con le tabelle del nostro database. LINQ to Entities è pensato per scenari in cui le il database evolve in modo indipendente dal modello ad oggetti e dove non c'è necessariamente mappaggio uno-a-uno. Con EF posso esprimere nel  mio modello ad oggetti, da cui posso partire nella progettazione, relazioni molti-a-molti, come ad esempio quella tra Autori e Libri. L'architettura di EF inoltre consente di aggiungere provider per altri fornitori di DBMS. Esistono altre caratteristiche di differenziazioni e vi consiglio di leggere questo articolo per una trattazione completa.

    Potete vedere le slide della sessione da SlideShare qui.

    Spero che la presentazione vi sia stata utile e grazie a tutti per la numerosa partecipazione.

    Penso che a breve potrete trovare sul sito di .NetUmbria un reportage fotografico della splendida giornata, nonchè il matereriale delle altre presentazioni ...

  • Pietro Brambati Blog

    LINQ to SQL e LINQ to Entities

    • 22 Comments

    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

  • Pietro Brambati Blog

    LINQ To SQL - Parte II

    • 3 Comments

    LINQ rappresenta una delle novità più importanti per lo sviluppo nella prossima release di Visual Studio.

    LINQ è una serie di estensioni al linguaggio, sia per C# che VB.NET, che ci permettono di utilizzare degli operatori "alla SQL" per lavorare su diverse sorgenti dati.

    Questa è la quarta parte di una serie di post. Negli altri post ho affrontato i segueti argomenti:

    In questo post continuo l'esplorazione di Linq to SQL. Spero che le altre puntate siano state utili :-). Grazie delle mail :-)

    Nel post precedente trovate tutti i riferimenti passo-passo su come partire a realizzare la prima applicazione con Linq to SQL in una console application. Ho cominciato a mostrare come utilizzare il designer di VS 2008 per effettuare il mappaggio tra le tabelle di un databbase SQL server con le classi della nostra applicazione, quelle che costituiranno l' Obect Model dell'applicazione stessa. Sempre nella prima parte ho mostrato come effettuare operazioni di query usando la sintassi offerta da LINQ.

    Ma se voglio aggiungere un nuovo record nel mio database o modificarne uno esistente come faccio?

    Update

    Se voglio modificare un oggetto e poi fare in modo che questo venga persistito nel database l'operazione è molto semplice: faccio tutte le modifiche del caso e quando voglio persitere lo stato del mio oggetto sul database invoco il metodo SubmitChanges().

    C#

    clip_image002

    VB.NET

    clip_image004

    In figura vedete la query generata per l'esecuzione del codice in C#. Nel precedente post ho raccontato come abilitare il trace degli statements SQL generati da LINQ.

    clip_image006

    Notate che è stata generata una sola query per la selezione del prodotto: SELECT TOP 1 ... questo grazie al Deferred Execution Model con cui LINQ lavora: ho espresso infatti la query LINQ con due blocchi di codice distinti, il primo per selezionare tutti i prodotti di una certa categoria, il secondo per ottenere il primo prodotto in base all'operatore .First().

    La seconda query è quella che forza l'Update del nostro prodotto selezionato e che viene generata da LINQ perchè abbiamo effettuato la chiamata a SubmitChanges(). Guardate come la clausola di update va a selezionare il prodotto che andrà ad oggiornare: LINQ si accorge se ci sono state modifiche fatte da altri prima di lanciare la query. LINQ gestisce quella che viene definata come Optimistic Concurrency: in sostanza l'aggiornamento del nostro prodotto, va a buon fine solo se non sono state apportate modifiche al prodotto stesso da quando lo abbiamo precedentemente letto.

    Insert/Delete

    L'inserimento di un nuovo prodotto segue linee simili.

    clip_image008

    Ho creato una nuova istanza dell' oggetto Product, che rappresenta il prodotto da aggiungere al database. Ho stampato nella console  l'ID del prodotto prima e dopo l'aggiornamento. Se eseguite il codice noterete che dopo la SubmitChanges(), tale valore è cambiato è rappresenta correttamente la chiave che la corrispondente riga ha nella tabella del database.

    Se voglio cancellare un prodotto, in VB.NET posso scrivere:

    clip_image010

    In questo caso ho usato la Remove alla quale dovevo passare un prodotto, quello da cancellare appunto, così dopo aver fatto una query che mi poteva ritornare anche più prodotti ho usato il metodo First per selezionare il primo.

    Con una Lamba Expression ...

    Avrei potuto scrivere la stessa cosa usando una sintassi equivalente:

    clip_image012

    Nel codice precedente vedete che ho indicato l'intenzione di selezionare  un solo prodotto invocando il metodo Single su Products, il codice che ho utilizzato nelle parentesi mi ha permesso di fare la selezione opportuna). L'espressione usata in figura è una lamba Expression, una delle novità di C# 3.0.

    Si può pensare ad una Lamba Expression come ad una modalità offerta dal linguaggio per scrivere del codice in-line. Avrei infatti potuto esprimere lo stesso codice in C# 2.0 in modo più verboso usando un metodo anonimo.

    Ok probabilmente ci sarebbe da fare qualche esempio in più ... in questo articolo trovate meglio descritte le Espressioni Lambda in VB.NET.

    Anche in VB.NET è possibile utilizzare una Lambda Expression, ecco come:

    clip_image014

    Aggiungere un prodotto alla Categoria "Beverages"

    Negli esempi visti in precedenza ho semplicemente aggiunto un prodotto nel nostro database inizializzando alcune proprietà come ad esempio il nome del prodotto stesso. Ok, ma abbiamo visto che un prodotto è in relazione molti-a-1 con la tabella categoria, il prodotto ha infatti un campo CategoryID, che è un intero, e che permette di navigare nel database e trovare la corrispondente riga nella tabella categoria e quindi sapere qual è il nome della categoria stessa ....

    Come faccio quindi ad aggiungere un prodotto in una specifica categoria, di cui conosciamo il nome, come ad esempio "Beverages" ? Linq To SQL ci permette di navigare in modo molto semplice tra gli oggetti della nostra applicazione e quindi selezionata una specifica categoria possiamo facilmente aggiungere un nuovo prodotto .

    Ok troppe parole, ecco il codice:-)))

    clip_image016

    Quello che succede sul database, lo vediamo andando a "spulciare" la query generata :

    clip_image018

    La query mostra la INSERT del nuovo prodotto in cui viene impostato il nome "Nuova Bevanda 2", come volevamo; notiamo , però, che viene anche impostata la categoria, tramite l 'ID della stessa, che nel nostro esempio è 1. La cosa interessante è che nel codice che abbiamo scritto con LINQ non abbiamo impostato l'ID della categoria, ma ne abbiamo usato il nome e così abbiamo aggiunto un nuovo prodotto tra quelli della categoria "Beverages", molto più semplice vero?

    Conclusione

    In questo post abbiamo visto come tramite LINQ to SQL siamo in grado di gestire anche le operazioni di Insert/Update e Delete dei nostri oggetti, a cui LINQ fa corrispondere una query sul database. LINQ non solo ci permette questo, ma per di più semplifica l'interazione con il database semplificandone la navigazione: abbiamo aggiunto un prodotto alla categoria "beverages" senza preoccuparci della relazione tra prodotto e categoria.

    Insieme al post precedente spero di essere riuscito a mostrarvi come sia semplice scrivere uno strato di accesso ai dati usando LINQ to SQL. Il tutto semplificato dall'aiuto offerto dall designer di Visual Studio 2008,  dall' Intellisense e dal fatto che le interrogazioni che facciamo con LINQ sono strong-typed.

    Ma c'è molto altro ... stay tuned!

    Link utili:

    In questo articolo LINQ to SQL viene presentato in modo chiaro e completo.

    LINQ to SQL: .NET Language-Integrated Query for Relational Data (articolo MSDN in inglese)

    Espressioni Lambda in VB.NET.

    Percorso:

    Per chi non ha seguito passo-passo consiglio il seguente percorso con laboratori:

    1. Scaricare la beta 2 di Visual Studio 2008
    2. Laboratori di Linq in C#
    3. Laboratori di Linq in VB.NET

    Ciao e alla prossima.

    -Pietro

  • Pietro Brambati Blog

    Task Manager e Windows Vista Virtualization

    • 1 Comments

    Forse non molti hanno notato che il nuovo Task Manager di Windows Vista ha una nuova colonna "Virtualization", abilitabile come al solito da View->Select Colums... e quindi selezionado la colonna Virtualization. Questa colonna si rifà alla funzionalità di virtualizzazione di Windows Vista per il file system ed il registry.

    In poche parole: con l'UAC (User Acount Control) attivo in Windows Vista anche quando si è loggati alla macchina come amministratori si lavora come standar users, questo a meno di uno specifico consento da parte dell' utente, che viene invitato ad "elevare i suoi privilegi" per certe operazioni, ad esempio per modificare la configurazione di IIS.

    Ora per preservare il funzionamento di "vecchie" applicazioni, come ad esempio il notepad, che non potrebbero scrivere in talune locazioni, in particolare %SystemRoot% (%windir%), %ProgramFiles% e %ProgramData%, Windows Vista con il processo di virtualizzazione redirige la scrittura verso uno storage virtuale, nel caso di scrittura su file system su %LOCALAPPDATA%\VirtualStore, quindi una directory specifica dell'utente.

    Facciamo un esperimento. Da una macchina Windows Vista con l'UAC attivato apriamo notepad e tentiamo di scrivere su c:\windows un semplice file di testo. Riceveremo un messaggio di errore di accesso negato. Guardiamo ora la colonna Virtualization del Task Manager e notiamo che è impostato di Disable. Ora tasto desto sulla colonna, selezioniamo "Virtualization" e premiamo "Yes" al messaggio di Warning.

    Ripetiamo l'esperimento e noteremo che questa volta siamo riusciti a salvare il file, ma dove? Per vederelo andiamo con l'Explorer sotto la directory c:\windows dove pensiamo di aver scritto il file. Il menù dell' Explorer avrà un nuovo taso "Compatibility File" come mostrato in figura.

    Se lo premiamo, apriremo la directory locale dell'utente che "virtualizza" la directory c:\windows e dove troveremo il nostro file, nel mio caso la directory virtualizzata è "C:\Users\pietrobr\AppData\Local\VirtualStore\Windows"... ed ecco svelato il mistero di dove viene salvato il file grazie al processo di virtualizzazione.

  • Pietro Brambati Blog

    .NET Framework 3.5 SP1 Client Profile (beta)

    • 2 Comments

    Cioe?

    Con la beta 1 della SP1 di .NET 3.5 arriva una nuova importante modalità di installazione del .NET Framework. Un sottoinsieme delle librerie di .NET 3.5 SP1 saranno pacchettizzate per offrire le funzionalità necessarie alle sole applicazioni client. Inoltre un nuovo bootstrapper  più leggero (circa 200KB) migliorerà le performance in fase di installazione.

    Perchè una versione Client di .NET  ?

    Con la maturità e complettezza delle funzionalità di .NET 3.5 la dimensione del framework è diventata ormai importante. Per chi sviluppa applicazioni client si apre quindi una nuova possibilità: usare una versione ridotta di .NET FX 3.5 pensata appunto per le sole applicazioni client.

    La versione client di .NET è composta da un sottoinsieme, che occupa circa 26 MB, degli assembly del full-net framework: le librerie sono le stesse, non serve quindi ricompilare un'applicazione pacchettizzata per .NET client profile per farla girare sulla versione full. Le componenti di massima incluse sono:

    • CLR
    • WinForms
    • ClickOnce
    • WPF e WCF

    Scenari di installazione del .NET Framework

    Il nuovo bootstrapper è in grado di gestire scenari di upgrade, ad esempio se ho una macchina con installato già .NET 3.0, verranno scaricati solo i file di update per la versione 3.5 SP1 del framework e le relative fix per la versione 2.0 e 3.0 del framework.

    Supporto in Visual Studio 2008

    VS 2008 già supporta la possibilità di scegliere il framework di riferimento per creare un' applicazione, con la nota funzionalità detta di multi-targeting con cui posso decidere se sviluppare per .NET 2.0, .NET 3.0 o .NET 3.5. Ora una proprietà di progetto, esposta tramite un check-box abiliterà il supporto per l'uso del Client Framework, come si vede in figura:

    clip_image002

    In caso useremo API o metteremo reference a dll non presenti nella versione client del Framework riceveremo un warning a compile-time. Le applicazioni così realizzate verrano inoltre marcate nel manifest con un opportuno flag che permetterà al run-time in esecuzione di sapere se l'applicazione è in grado di girare correttamente. Se si cerca di far girare un'applicazione che richiede il full-framework, il client profile avvertirà quindi l'utente di scaricare la versione completa.

    Conclusione

    La nuova SP1 di .NET 3.5 (rilasciata oggi in beta 1) e Visual Studio 2008 contiene molte altre novità, potete partire da questo post per farvi un'idea.

    Visual Studio 2008 SP1 Beta Documentation

  • Pietro Brambati Blog

    Javascript : caricare script dinamicamente e dipendenze

    • 0 Comments

    Come si sa il modo più sempice e classico per caricare file javscript in una pagina è l’uso del tag <script> messo nell’ head della pagina HTML. Ad esempio, se vogliamo caricare il file javascript myfunc.js scriveremo qualcosa del genere:

    image

    Alcune delle considerazioni che possiamo fare sono:

    • i file vengono caricati in serie (anche se questo non è sempre vero per tutti i browser) e questo può portare ad un rallentamento del caricamento iniziale della pagina, a maggior ragione in presenza di numerosi file e soprattutto la prima volta che un visitatore arriva su un nostro sito e i file .js non sono nella cache del suo computer.
    • inoltre se carichiamo un file molto grosso, con delle funzioni che non vengono usate fino  a quando l’utente non fa qualcosa sulla pagina, il caricamento della pagina rimane in attesa inutilmente. Se carichiamo una complicatissima funzione somma (o una funzione per la verifica di acquisto, ad esempio) ma il nostro visitatore non premerà il pulsante somma o acquisto, abbiamo fatto un’operazione di carimento in questo caso inutile e magari l’utente ha l’impressione che il sito sia lento perchè la pagina non viene caricata subito.

    Se siamo giunti a queste considerazioni, o ci troviamo nel caso di volere ottimizzare la pagina, probabilmente ci si presenta la possibilità di aggiungere dinamicamente i file javascript al DOM della pagina stessa. Il DOM è il Document Object Model ed è sostanzialmente una rappresentazione ad albero di tutto quello che compone la nostra pagina HTML. In un punto a piacere nel body della pagina potremmo volere modificare il DOM nel modo seguente: il codice dovrebbe funzionare su tutti i browser più recenti:

    image

    A questo punto il file javascript verrà aggiunto alla pagina.

    Il vantaggio più evidente di questa tecnica è che possiamo aggiungere file javascript in un secondo momento rispetto al primo caricamento della pagina e magari on-demand, cioè solo quando ne abbiamo bisogno ad esempio quando l’utente preme un pulsante.

    Ok, ma quali possibili problemi possiamo incontrare?

    • il file javscript potrebbe essere già presente e magari già caricato nel DOM. Supponiamo di voler aggiungere jquery alla pagina, se la pagina non l’abbiamo fatta noi o magari andiamo ad inserire del codice in una pagina già fatta, ad esempio in un blog, il file potrebbe essere già presente. JQuery è una libreria molto usata ed è molto probabile che sia già stata usata da qualche parte.
    • Quando andiamo ad usare le funzioni della libreria dobbiamo verificare che questa sia disponibile nel momento in cui il nostro codice javascript la usa. Questa volta il caricamento avviene in modo asincrono e quindi il codice potrebbe richiamare una funzione di una libreria non ancora caricata.

    Guardiamo il codice seguente dove carico jquery usando la tecnica vista e poi faccio una semplice chiamata usando l’oggetto Jquery per andare ad impostare un alert su un tag ancora:

    image

    Se lancio l’applicazione ottengo un errore: perchè l’oggetto JQuery, cioè $, non è ancora definito quando lo devo usare, lo vedete bene nella developer toolbar di Internet Explorer 8:

    image

    Ironia della sorte l’oggetto $ è proprio quello che jQuery mi mette a disposizione per verificare che il DOM della pagina è pronto. Il motivo è proprio che l’oggetto JQuery, cioè il simbolo $, non è definito nel momento in cui eseguiamo il nostro codice Javascript che vuole usare la suddetta libreria. Per preveniere questa situazione alcune tecniche di programmazione Javascript prevedono d’ implementare una sorta di timer in attesa del caricamento effettivo della libreria: una tecnica che funziona e che non è neanche così inefficente come potrebbe sembrare.

    • un altro problema che possiamo incontrare è la gestione delle dipendenze: se vogliamo caricare dinamicamente in modo asincrono ma ci sono delle dipendenze tra i file javascript, la situazione si complica ulteriormente: ad esempio se vogliamo usare la libreria jQueryUI, questa dipende da jquery. Quindi in questo caso dovrei essere sicuro di caricare prima jquery, alla fine del caricamento e solo alla fine, caricare jquery.UI e quando le librerie di jQueryUI sono disponibili scrivere il mio codice.

    Per risolvere queste problematiche ed avere numerosi altri vantaggi possiamo usare il Microsoft Ajax Script Loader, un componente della Microsoft Ajax Library,ed in particolare il modulo che implementa un loader per file javascript e la gestione delle dipendenze: Start.js.

    Il Microsoft Ajax Script Loader

    Il modo più rapido per imparare ad usare le MS Ajax Library è partire da questo link al sito. Nel seguito mi focalizzerò primariamente sul loader, le caratteristiche di questo loader sono:

    • contenuto in un unico file Start.js che può essere scaricato dalla CDN Microsoft, o localmente al vostro progetto. L’uso di una CDN consente di migliorare i tempi di download avendo una cache distribuita sui server Microsoft in modo geografico.
    • Riduce i tempi di download iniziali di un’applicazione, differndo il downlaod del javascript in seguito.
    • contiene riferimenti ad un serie di file javascript come Jquery o le MS Ajax library che vengono scaricate da una CDN, ma se ne possono aggiungere di propri e anche per questi definire delle dipendenze.
    • gestiste le dipendenze tra file javascript in modo che vengano caricati nell’ordine opportuno per il loro buon funzionamento.
    • consente di combinare tra loro file javscript in un unico file, prima del downlaod, così da fare un unico downlaod di un file invece di n piccoli download, che scatenerebbero più richieste http sulla rete.
    • esegue il caricamento di file javascript on-demand, quando effettivamente richiesto.

    Vediamo un primo esempio d’uso:

    Caricamento dei file js necessari

    image

    Inizialmente ho caricato il file Start.js, il nostro loader appunto, direttamente dalla CDN Microsoft, non ho dovuto quindi aggiungere nessun file .js al mio progetto.

    Usando ora l’istruzione Sys.require, Visual Studio ci mette a disposizione l’intellicese anche per queste istruzioni Javascript, possiamo specificare quali sono i file javascript necessari. Come vi dicevo il loader ha già una serie di file preimpostati, tra questi c’è anche jquery e quindi potete scrivere Sys.scripts.jQuery.

    La lista dei file disponibili out-of-the box  (al momento) è:

    image

    I file vengono presi dalla CDN microsoft. Nella CDN trovate anche jquery 1.4.1 e potete utilizzare quest’utima versione con la tecnica vista nel seguito, in cui andremo a indicare file custom da caricare.

    Inoltre notate che all’istruzione Sys.require viene passata la funzione funDOM che verrà eseguita al caricamento completato e quando sarà disponibile l’oggetto jQuery. In questo modo quindi:

    • abbiamo caricato il file jQuery dalla CDN in asincrono (rispetto al caricamento iniziale della pagina).
    • siamo certi che il codice eseguito dalla funzione funDOM potrà contare sul fatto che gli oggetti nel file javascript da cui dipende sono disponibili.

    Caricamento dei file js custom e in dipendenza

    L’ Ajax Script Loader ci consente anche di  caricare file custom, cioè non quelli presenti sulla CDN, come ad esempio jqueriUI. Quest’ultimo in dipendenza da JQuery, per fare questo dobbiamo prima istruire il loder sulle dipendeze, come nel codice seguente:

    image

    Il codice usa il metodo .defineScript per definire il file custom, nelle due versioni release e debug. La versione scelta è definita da una costane nel loader, verrà presa quella di release se il file è Start.js, quella di debug se il file è Start.debug.js.

    Vedete inoltre che il file jquery.ui dipende (dependencies) dal file jQuery, ma la lista potrebbe essere estesa e il caricamento del file sarà considerato completato (isLoaded)quando le variabile windows.jQuery e jQuery.ui saranno definite.

    Grazie a questo codice possiamo scrivere:

    image

    Questa volta semplicemente impostiamo come required lo script JQueryUI, che a sua volta dipende da JQuery. La nostra funcDOM funzionerà correttamente, il datepicker ad esempio è un plugin di jquery. Nella scherma seguente vedete un’esempio in esecuzione all’interno del browser Opera 10:

    image

    Conclusione

    In questo post abbiamo visto come il Microsoft Ajax Loader, consenta di risolvere alcuni dei problemi più fastidiosi che si hanno quando si lavora con il javascript come: caricamento on-demand di file js, gestione delle dipendenze tra file js, verifica del caricamento dei file js prima dell’esecuzione di file javascript nella pagina. Vi posso consigliare anche di leggere questi how-to su: HOW TO Detect DOM Ready, in cui vedere come usare le funzioni  .domReady e .pageLoad; ed in generale trovate molte informazioni sulle Microsoft Ajax Library a questo link.

    Spero che il post vi sia piaciuto.

    Download

    Potete scaricare il codice dell’esempio da qui.

  • Pietro Brambati Blog

    Lazy Remote Validation with ASP.NET MVC 3

    • 0 Comments

    …Or How to prevent unnecessary http call on Remote Validation with ASP.NET MVC 3 and JQuery.

    One of the cooler features with ASP.NET MVC 3 is Remote Validation. In a nutshell you can create a method on a controller class, putting the attribute Remote on your model and having jQuery.Validator plugin making an HTTP call to the controller to perform a custom validation logic that requires server-side logic, like for example check if a product name already exists on your database.

    The JQuery.Validator plugin, in documentation says that: “Once a field was marked invalid, it is eagerly validated: As soon as the user entered the necessary value, the error message is removed”. This works great for me in case I have a field and the validation happens only client-side, but in case of a remote validation scenario, what happens is that an HTTP call is made every time user press a key.

    If you look to what happens with a developer toolbar, you will see that every time you type a char an HTTP call is done. In the following image you see 4 HTTP calls. After the first one I press the tab key, a call is made and the field is marked as invalid, so I go back to the “ProductName” text box, and after that every time a press a key the JQuery.Validator eagerly try to validate remotely and make an HTTP call.

    clip_image002

    I want to avoid these calls every time and also I don’t want to to modify the two out of the box jquery file used by ASP.NET MVC: jquery.validate.js and jquery.validate.unobtrusive.js. My solution is to use the onkeyup event of the jQuery.Validate plugin and search for the html element that use the data-val-remote-url attribute and in that case prevent validation.

    Here the code I have used in the razor view:

    clip_image003

    This helps me to reduce the HTTP calls as outlined in the following image. Here I have only 2 HTTP calls: the first one when I change the focus the first time, so that the HTML field became invalid and the second the second time. Note that I’ve written the same numbers of keys between the first and the second time as before, but now I have less calls.

    clip_image005

    The side effect to this solution is that validation on other fields with other validators start eagerly on every keyup event, but this could be considered reasonable in many situations.

    You can download the javascript file from here.

    I hope this snippet could help others that want to achieve the same result.

  • Pietro Brambati Blog

    Uno sguardo a Silverlight

    • 9 Comments

    Microsoft ha da poco annunciato Silverlight. Una nuova tecnologia, precedente nota come WPF/E, per lo sviluppo di applicazioni web. Con Silverlight è possibile includere contenuti multimediali di natura diversa, offre supporto per grafica vettoriale 2D e molto altro ...

    Aprite questo link per farvi un'idea .. non necessariamente con IE.

    Cos'è?  Da un punto di vista architetturale Silverlight è un plug-in per il browser che offre una versione "ridotta" di WPF (Windows Presentation Foundation), che però è cross-browser e cross-platform e che quindi non richiede di avere sulla macchina installato il .NET Framework 3.0 e non richiede che sia usato solo Internet Explorer come browser. Infatti è possibile utilizzare come browser anche Firefox, Safari, Opera e può funzionare sia su piattaforma Windows che MAC.

    Attualmente sono disponibili due preview di Silverligh, la 1.0 (in versione Beta) e la 1.1 ( in alpha).

    Silverlight 1.0

    • plugindi circa 1.2 MB
    • si integra facilmente con le applicazioni AJAX, dato che con codice Javascript si può aggiornare sia HTML che il codice XAML
    • supporto per codec VMV, WMA, MP3 e VC-1, quest'ultimo permette di avere video di alta qualità (è lo stesso formato supportato da HD-DVD e Blueray DVD).
    • E' possibile scaricare una preview CTP di Expression Blend 2 e Expression Media Encoder se volete comincaire a realizzare un'applicazione con Silverlight e siete dei designer. Se siete invece più avvezzi all'uso di Visual Studio scaricate le ASP.NET Futures  (May CTP). Ad ogni modo trovate la lista completa di quello vi può servire per sviluppare con Silverlight qui, compreso il link per scaricare la Beta 1 di "Orcas", che contiene il template per un progetto Silverlight.

    Silverlight 1.1

    Con la versione 1.1 di Silverlight vengono aggiunge numerose altre funzionalità: in particolare il plug-in contiene un'implementazione del .NET Framework (CLR+BCL) e anche un DLR (Dynamic Language Runtime). Infatti è possibile sviluppare non solo usando i consueti linguaggi .NET (C#, VB), ma anche usando linguaggi dinamici come Python e Ruby. 

    • Il CLR è derivato direttamente da quello della versione completa di .NET Framework e include lo stesso sistema dei tipi, Garbage Collector, JIT etc
    • Include il supporto per una vasta serie di librerie: IO,Networking, LinQ, Generics
    • Managed HTML DOM API: cioè è possibile usare codice .NET per scrivere codice managed che interagisca con l'HTML della pagina
    • il tutto in soli 4MB di spazio!

    Ecco una visione d'insieme:

    Silverlight Architecture

    Per maggiori dettagli sull'architettura, consultate questo link.

    In sintesi Silverlight permette di usare in modo combinato sfruttando diverse tecnologie:

    • XAML per sfruttare tutta la potenza del 2D di WPF. La più grande differenza tra WPF e Silverlight è che, quest'ultimo non supporta il 3D, però permette una maggiore adozione essendo cross-broser e cross-platform.
    • JavaScript e alle estensioni a Javascript che permettono un maggior controllo della UI dell'applicazione web.
    • Integrazione con ASP.NET AJAX
    • Possibilità di utilizzare linguaggi managed e dinamici per lo sviluppo

     

    Da dove iniziare ? qui.

    -Pietro

  • Pietro Brambati Blog

    Silverlight 2 beta 2 dopo il weekend

    • 0 Comments

    La beta 2 è stata rilasciata tra la notte di venerdì e sabato, direi quindi che i colleghi di corp hanno rispettato quando annunciato al TechEd la scorsa settimana. Se non avete ancora letto la notizia direi che potete leggere il post ufficiale di scottgu qui. Sabato mattina sono giusto riuscito a far partire il post sul blog MSDN italy con il video (5 minuti) che avevo registrato qualche giorno fa, prima di essere fagocitato dal weekend :-). Ora che siamo giunti a lunedì ho un po’ di tempo per raccontare a chi legge per la prima volta le novità di questo rilascio.

    La beta2 è la naturale evoluzione della beta 1 di Silverlight 2, con in più la licenza go-live, che vi permette di iniziare ad usare SL 2 per fini commerciali.

    Cosa serve per iniziare a sviluppare con la beta 2 di Silverlight 2?

    Il modo più rapido è andare sul sito silverlight.net/GetStarted dove trovate tutto: se non avete una versione di Visual Studio 2008 potete scaricare una trial, dalla Standard in su. La beta 2 di Silverlight 2 è compatibile con la beta 1 di .NET Framework 3.5, a differenza della beta1 di SL. Ora scaricate il file Silverlight-chainer dal sito Microsoft che , verificherà la corretta installazione delle fix per Visual Studio 2008 RTM, installerà il run-time di Silverlight, l’SDK che contiene documentazione ed esempi ed i Tools per Visual Studio 2008: il tutto in un colpo solo!

    Ora procedete con l’installazione di Expression Blend 2.5 June CTP: questo è un tool per designer, ma anche per developer, nel senso che vi dà la possibilità di non scrivere il codice un “po’ noioso” che di solito ai dev non piace scrivere: personalmente non mi piace e trovo quasi impossibile come definire il gradiente di colore di un bottone! Una delle novità più importanti di Expression Blend è il supporto per il Visual State Manager (VSM), un pattern per realizzare lo “skinning” dei controlli, di cui vi parlerò in un prossimo post.

    Installate ora Deep Zoom Composer: è il tool che serve per lavorare con l’omonima tecnologia, che consente di far navigare un utente su web in immagini ad altissima risoluzione, andando sempre più in profondità per scoprire particolari difficilmente visibili dall’immagine nella visione originale: pensate quanto può essere bello avere delle immagini di dipinti di un museo e poter “navigare” nell’immagine a livelli di zoom diversi.

    Silverlight 2 beta 2 e compatibilità

    La beta 2 è compatibile con Silverlight 1.0 (RTW) , la versione di Silverlight già rilasciata, mentre ci sono alcune modifiche da apportare per chi ha usato la beta 1, le modifiche alle API sono documentate qui: breaking changes between beta 1 and beta 2. Per chi ha progetti con la beta 1 penso troverà utile anche questo post.

    Come rendersi conto che la beta 2 è installata ?

    Beh, andate sul sito www.microsoft.com/silverlight che vi dirà che avete installato l’ultima versione di SL

    clip_image002

    Facendo tasto destro sull’applicazione SL notiamo quache nuovo tab, come vedete in figura:

    clip_image004

    Il DRM è una delle novità della beta 2 , tramite il supporto a Windows DRM e PlayReady DRM.

    Inoltre è presente un tab per la gestione dell’ “Application Storage”. SL 2 dà la possibilità di avere uno spazio isolato, detto Isolated Storage, cioè uno spazio virtuale su file system, legato al profilo dell’utente e alle applicazioni web. Le applicazioni web condividono tale spazio a livello di dominio web ( ad esempio più applicazioni web nello stesso dominio microsoft.com, condividono la stessa quota). La quota iniziale è di circa 1MB (nella beta 2), ma è possibile, utilizzando un’opportuna API, aumentare lo spazio a disposizione. Le applicazioni SL 2 non hanno accesso diretto all’ I/O su disco dell’utente, per ovvie ragioni di sicurezza, ma possono avere accesso a questo spazio “protetto”. Nel tab potete abilitare sul client l’Application Storage e gestirlo, cancellando l’eventuale sapzio già allocato.

    clip_image006

    Documentazione on-line/off-line e Quick Start

    E’ già raggiungibile a questo url la documentazione su MSDN.

    Potete anche scaricare il CHM, consultabile offline.

    Qui potete raggiungere il quick start sulla beta 2.

     

    Ai prossimi post per approfondimenti …

Page 1 of 11 (261 items) 12345»