<?xml version="1.0" encoding="iso-8859-15"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xml:lang="it-it"><title>blogs.ASPItalia.com</title><id>http://blogs.aspitalia.com/az/</id><link href="http://blogs.aspitalia.com/az/" rel="self" type="application/rss+xml" /><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/" /><generator uri="http://feed.aspitalia.com/" version="1.0">feed.ASPItalia.com 'Caesar Reborn' 2009.6.29</generator><author><name>blogs.ASPItalia.com</name><uri>http://blogs.aspitalia.com/az/</uri></author><updated>2009-06-25T18:02:20+00:00</updated><icon>http://gui.ASPItalia.com/images/aspitalia/syndication.gif</icon><entry><title>Migliorare la lettura di un sito</title><id>http://blogs.aspitalia.com/az/post2516/Migliorare-Lettura-Sito.aspx</id><updated>2009-06-25T18:02:20+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2516' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Mi piace il progetto &lt;a title=&quot;link esterno&quot; href=&quot;http://lab.arc90.com/experiments/readability/&quot;&gt;Readibility&lt;/a&gt;, da un sito pieno di riquadri, banner e inutilit&#224; varie (IMHO), &#232; possibile con un solo click passare per esempio da:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_2.png&quot;&gt;&lt;img title=&quot;layout normale&quot; border=&quot;0&quot; alt=&quot;layout normale&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_thumb.png&quot; width=&quot;524&quot; height=&quot;467&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;a:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_4.png&quot;&gt;&lt;img title=&quot;risultato finale&quot; border=&quot;0&quot; alt=&quot;risultato finale&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_thumb_1.png&quot; width=&quot;524&quot; height=&quot;467&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Comodo per stampe. Ed &#232; anche personalizzabile. Il tutto grazie ad un sapiente uso di Javascript. Carino.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Mia nota personale e domanda a me stesso: se ci si trova in due o pi&#249; a condividere un'idea, &#232; giusto buttarsi in ci&#242; che c'&#232; gi&#224; nell'inutilit&#224; generale dell'insulsaggine del gi&#224; visto?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Javascript/&quot; rel=&quot;tag&quot;&gt;Javascript&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XHTML/&quot; rel=&quot;tag&quot;&gt;XHTML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Software"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2516/Migliorare-Lettura-Sito.aspx"/><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2516/Migliorare-Lettura-Sito.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2516.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2516</trackback:ping></entry><entry><title>C# 4.0 Beta 1, quello che io ho visto</title><id>http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx</id><updated>2009-05-24T18:33:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2507' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Gioved&#236; ho trovato il tempo di installare sulla mia macchina la nuova versione di Visual Studio 2010 beta 1. Leggendo i vari documenti sulle novit&#224;, la mia curiosit&#224; &#232; stata attratta dalle novit&#224; del linguaggio C# della version 4.0. Da quel che ho capito sono quattro le &lt;em&gt;novit&#224;&lt;/em&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Dynamic Typed Objects&lt;/li&gt;&lt;li&gt;Optional and Named Parameters&lt;/li&gt;&lt;li&gt;Improved COM Interoperability&lt;/li&gt;&lt;li&gt;Co/Contra-Variance&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Sui &lt;em&gt;dynamic&lt;/em&gt; ho avuto proprio una discussione sul fatto che la keywork &lt;em&gt;dynamic&lt;/em&gt; non centra nulla con &lt;em&gt;var&lt;/em&gt;. La dichiarazione di un oggetto come &lt;em&gt;dynamic&lt;/em&gt;, crea effettivamente un oggetto di tipo dinamico in runtime ed elaborato in late-binding, con tutti i problemi che ne derivano!&lt;/p&gt;&lt;p&gt;Scrivere queste linee di codice ora &#232; perfettamente corretto:&lt;/p&gt;&lt;code&gt;dynamic az = &amp;quot;Andrea&amp;quot;;&lt;br /&gt;Console.WriteLine(az); // Andrea&lt;br /&gt;az = 14;&lt;br /&gt;az = 14 * 2;&lt;br /&gt;Console.WriteLine(az); // 28&lt;br /&gt;az = new System.Data.DataTable();&lt;br /&gt;Console.WriteLine(az.GetType()); // System.Data.DataTable&lt;/code&gt;&lt;p&gt;Ma questo nuovo oggetto &#232; utilizzabile anche nelle dichiarazioni di metodi e altro:&lt;/p&gt;&lt;code&gt;Dynamic1(&amp;quot;aa&amp;quot;);&lt;br /&gt;Dynamic1(12);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;static void Dynamic1(dynamic value)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; if (value is string)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Console.WriteLine(value + &amp;quot; is a string!&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0; if (value is int)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Console.WriteLine(value + &amp;quot; is a int!&amp;quot;);&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Ma la potenzialit&#224; del &lt;em&gt;dynamic&lt;/em&gt; vanno ben oltre. E' possibile ora chiamare oggetti &lt;em&gt;COM &lt;/em&gt;in modo molto pi&#249; semplice, ed &#232; diventato anche banale caricare &lt;em&gt;runtime&lt;/em&gt; una &lt;em&gt;dll&lt;/em&gt; e utilizzarne i metodi. Per esempio, avevo questa classe in una dll esterna:&lt;/p&gt;&lt;code&gt;namespace TestDynamic&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class Utilities&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string GetAll(string name)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return string.Format(&amp;quot;{0}: {1}&amp;quot;, name, DateTime.Now);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Possiamo caricarla e utilizzarla con i &lt;em&gt;dynamic&lt;/em&gt; (senza &lt;em&gt;reference&lt;/em&gt;). Un esempio di codice che fa questo:&lt;/p&gt;&lt;code&gt;dynamic mya = Assembly.LoadFile(&amp;quot;../class.dll&amp;quot;);&lt;br /&gt;Type myaClassType = mya.GetType(&amp;quot;TestDynamic.Utilities&amp;quot;);&lt;br /&gt;dynamic myaDemoClassObj = Activator.CreateInstance(myaClassType);&lt;br /&gt;string val = myaDemoClassObj.GetAll(&amp;quot;az&amp;quot;);&lt;/code&gt;&lt;p&gt;Facile e comodo? Pu&#242; essere, ma l'utilizzo del &lt;em&gt;dynamic &lt;/em&gt;non &#232; immune da problemi. Innanzitutto prestazionale: come detto prima, tutto ci&#242; che &#232; &lt;em&gt;dynamic&lt;/em&gt; &#232; elaborato in &lt;em&gt;runtime/late-binding&lt;/em&gt;, dunque con tutti i problemi di prestazioni che ne derivano. L'esempio&amp;#xa0;di codice qui sopra, se confrontato con un metodo tradizionale di loading di una dll e utilizzo del &lt;em&gt;reflector&lt;/em&gt; o, meglio, di &lt;em&gt;interfacce&lt;/em&gt;, perde su tutti i fronti. Secondo problema: Visual Studio 2010 non &#232; in grado di fornici l'intellisense:&lt;/p&gt;&lt;p&gt;&lt;img align=&quot;baseline&quot; alt=&quot;Dynamic in Visual Studio 2010 beta 1&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/Immagini/dynamic.JPG&quot; border=&quot;0&quot; hspace=&quot;0&quot; complete=&quot;true&quot; complete=&quot;true&quot; /&gt;&lt;/p&gt;&lt;p&gt;L'utilizzo dei parametri opzionali o dichiarandone il nome &#232; una di quelle novit&#224; che ricordano tanto ci&#242; che &lt;em&gt;Visual Basic&lt;/em&gt; offre da parecchio tempo:&lt;/p&gt;&lt;code&gt;public string MyMethod(int Id = 0, string Name = &amp;quot;AZ&amp;quot;)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Che crea in automatico gli &lt;em&gt;overload&lt;/em&gt; del metodo passando ai parametri i valori di &lt;em&gt;default&lt;/em&gt; specificati:&lt;/p&gt;&lt;code&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod();&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod(1);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod(1, &amp;quot;Andrea&amp;quot;);&lt;/code&gt;&lt;p&gt;E se nell'esempio sopra volessimo passare solo il parametro &lt;em&gt;Name&lt;/em&gt; e non l'&lt;em&gt;Id&lt;/em&gt;? Questo codice ci darebbe errore, perch&#233; si aspetta in ogni caso come primo parametro un &lt;em&gt;int&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;MyMehotd(&amp;quot;Andrea&amp;quot;);&lt;/code&gt;&lt;p&gt;Una delle altre novit&#224; di &lt;em&gt;C# 4.0&lt;/em&gt;, &#232; la possibilit&#224; di dichiarare oltre al valore anche il parametro a cui sar&#224; assegnato:&lt;/p&gt;&lt;code&gt;MyMethod(Name: &amp;quot;Andrea&amp;quot;);&lt;br /&gt;MyMethod(Name: &amp;quot;Andrea&amp;quot;, Id: 1);&lt;/code&gt;&lt;p&gt;L'ultima novit&#224;, &lt;em&gt;Covariance&lt;/em&gt;&amp;#xa0;e &lt;em&gt;Contravariance&lt;/em&gt;. La covariance permette di trattare gli oggetti come il tipo da cui deriva. Per esempio, avendo le classi:&lt;/p&gt;&lt;code&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class First&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class Second : First&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;/code&gt;&lt;p&gt;Possiamo scrivere:&lt;/p&gt;&lt;code&gt;First[] coll = new Second[20];&lt;/code&gt;&lt;p&gt;Ma non possiamo in alcun modo utilizzare questa possibilit&#224; nel caso dei &lt;em&gt;generic&lt;/em&gt; essendo il C# a cui siamo abituati &lt;em&gt;invariant&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;List&amp;lt;Second&amp;gt; xsecond = new List&amp;lt;Second&amp;gt;();&lt;br /&gt;List&amp;lt;First&amp;gt; xfirst = xsecond;&lt;br /&gt;&lt;br /&gt;Cannot implicitly convert type 'System.Collections.Generic.List&amp;lt;Test1.Second&amp;gt;' to 'System.Collections.Generic.IList&amp;lt;Test1.First&amp;gt;'.&lt;/code&gt;&lt;p&gt;Attualmente ci sono altri metodi per copiare un oggetto o una collection di oggetti (&lt;em&gt;cast&lt;/em&gt; o &lt;em&gt;Linq&lt;/em&gt;). Con la nuove versione di C#, abbiamo una nuova tecnica&amp;#xa0; ma, come scritto sopra, per ora &#232; possibile solo con le &lt;em&gt;interfacce&lt;/em&gt; e &lt;em&gt;delegate&lt;/em&gt; modificare questo comportamento:&lt;/p&gt;&lt;code&gt;public class Other&amp;lt;T&amp;gt; where T : First // Or without constraint&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public class Other2&amp;lt;T&amp;gt; : IOther2&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;interface IOther2&amp;lt;out T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Ora, grazie all'interfaccia (e la specifica del &lt;em&gt;generic T&lt;/em&gt; con &lt;em&gt;out&lt;/em&gt;), possiamo utilizzare anche gli oggetti derivati della nostra classe:&lt;/p&gt;&lt;code&gt;var xot2 = new Other2&amp;lt;Second&amp;gt;();&lt;br /&gt;IOther2&amp;lt;First&amp;gt; xot21 = xot2;&lt;/code&gt;&lt;p&gt;La keyword &lt;em&gt;out&lt;/em&gt; &#232; utilizzata per specificare&amp;#xa0;gli oggetti in &lt;em&gt;output&lt;/em&gt;, mentre &lt;em&gt;in&lt;/em&gt; come &#232; facilmente intuibile &#232; utilizzabile come parametro &lt;em&gt;input&lt;/em&gt;&amp;#xa0;di metodi con i &lt;em&gt;delegate&lt;/em&gt;, eccole utilizzare entrambe con i &lt;em&gt;delegate&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;delegate T Func1&amp;lt;out T&amp;gt;();&lt;br /&gt;delegate void Action1&amp;lt;in T&amp;gt;(T a);&lt;br /&gt;...&lt;br /&gt;// Covariance&lt;br /&gt;Func1&amp;lt;Second&amp;gt; secondx = () =&amp;gt; new Second();&lt;br /&gt;Func1&amp;lt;First&amp;gt; firstx = secondx;&lt;br /&gt;// Contravariance&lt;br /&gt;Action1&amp;lt;First&amp;gt; act1 = (ani) =&amp;gt; { Console.WriteLine(ani.ToString()); };&lt;br /&gt;Action1&amp;lt;Second&amp;gt; cat1 = act1;&lt;br /&gt;cat1(new Second());&lt;/code&gt;&lt;p&gt;Ho detto qualcosa di inesatto? E' facile che sia cos&#236;: il mio studio sulle novit&#224; di questo linguaggio si basano su test e letture che il poco tempo libero attuale mi permette. Questa scusa mi lascia scevro di responsabilit&#224;? Se ne sono convinto io...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_4.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Visual_Studio/&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term=".NET4"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2507.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2507</trackback:ping></entry><entry><title>ATM e Moby TV</title><id>http://blogs.aspitalia.com/az/post2455/ATM-Moby-TV.aspx</id><updated>2009-01-23T09:28:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2455' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;
&lt;p&gt;Da buon &lt;em&gt;Milanese adottivo&lt;/em&gt;, per evitare di affrontare il traffico con mezzi propri, mi affido al trasporto pubblico. Dall'ultimo trimestre dell'anno scorso hanno messo in dotazione sui vari pullman anche la &lt;a href=&quot;http://www.mobytv.it/&quot; title=&quot;link esterno&quot;&gt;Moby TV&lt;/a&gt;, che, tra pubblicit&#224;, info, cartoni animati e altro, informa i viaggiatori.&lt;/p&gt; &lt;p&gt;Sinceramente questi apparecchi non mi interessano pi&#249; di tanto, ma ieri sera, durante il ritorno a casa, dopo aver appena guardato un cartone animano della serie &amp;quot;Stupid Cupid&amp;quot; dove uno Yeti scendeva dalla montagna perch&#233; innamorato di uno sciatore, una schermata nera ha attirato la mia attenzione.&lt;/p&gt; &lt;p&gt;La schermata del BIOS &#232; apparsa sul monitor. Conteggio di memoria veloce (se non ricordo male sono macchine con 512MB o 768, non ero cos&#236; vicino per vedere bene) e avvio della macchina. Il mio interesse si &#232; quindi rivolto completamente al video per capire quale sistema operativo utilizzasse. Dopo la schermata del bios riassuntiva della macchina ecco che si avvia... Linux. Controllo dei vari component, Udev e altro. Avvio classico di Xorg con il mouse a forma di &amp;quot;X&amp;quot; al centro dello schermo e avvio dell'applicazione della Moby TV.&lt;/p&gt; &lt;p&gt;La cosa che mi ha fatto sorridere &#232; stata: ma il riavvio era dovuto ad un crash di Linux o ad un altro problema della macchina?&lt;/p&gt; &lt;p&gt;Il 19 gennaio era il duecentenaio della nascita di &lt;a href=&quot;http://it.wikipedia.org/wiki/edgar_allan_poe&quot; title=&quot;link esterno&quot;&gt;Edgar Allan Poe&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Linux"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2455/ATM-Moby-TV.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2455/ATM-Moby-TV.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2455.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2455</trackback:ping></entry><entry><title>Moonlight - Silverlight 1-2</title><id>http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx</id><updated>2009-01-21T08:27:00+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2453' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;
&lt;p&gt;Da scoprire a installare Moonlight 1.0 &#232; passato un attimo. &lt;a href=&quot;http://go-mono.com/moonlight/&quot; title=&quot;link esterno&quot;&gt;Installazione&lt;/a&gt; veloce che richiede solo il riavvio di Firefox come ogni suo plug-in. L'inizio dei test avviene qualche minuto dopo. Innanzitutto: &lt;strong&gt;Moonlight 1.0 &#232; la versione 1 di Silverlight! Per vedere le applicazioni scritte in Silverlight 2 si dovr&#224; aspettare la versione 2.0 di Moonlight&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Le prove. Dai miei test sulle applicazioni scritte in Silverlight 1, solo il ~60% gira senza problemi. Mi ha sorpreso vedere filmati girare senza problemi e altre molto pi&#249; semplici visualizzare solo un rettangolo grigio e niente altro.&lt;/p&gt; &lt;p&gt;Quando sar&#224; disponibile la versione 2.0? &lt;a href=&quot;http://www.mono-project.com/MoonlightRoadmap&quot; title=&quot;link esterno&quot;&gt;Qui&lt;/a&gt; le risposte.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Mono/&quot; rel=&quot;tag&quot;&gt;Mono&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Mono"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2453.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2453</trackback:ping></entry><entry><title>Modificare i PDF</title><id>http://blogs.aspitalia.com/az/post2429/Modificare-PDF.aspx</id><updated>2008-11-09T09:40:19+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2429' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Prima o poi chiunque si trova di fronte a questo problemino (!?!?). Una soluzione veloce veloce free &#232; grazie ad una extension per &lt;em&gt;OpenOffice&lt;/em&gt;: &lt;a title=&quot;link esterno&quot; href=&quot;http://extensions.services.openoffice.org/project/pdfimport&quot;&gt;Sun PDF Import Extension&lt;/a&gt;. Scaricato e installato dal menu &lt;em&gt;Strumenti&lt;/em&gt; e &lt;em&gt;Gestione estensioni&lt;/em&gt;, ci permette di aprire in scrittura i documenti &lt;em&gt;PDF&lt;/em&gt; ed effettuare delle modifiche. &lt;em&gt;Delle&lt;/em&gt; modifiche perch&#233; non permette di rivoluzionare la struttura di un documento. Da miei piccoli test mi sono trovato pi&#249; volte il testo di un paragrafo separato per righe, quindi con difficolt&#224; nelle correzioni e unione dello stesso.&lt;/p&gt; &lt;p&gt;Per&#242; &#232; comodo. Anche nelle fredde ma assolate domeniche mattina.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Office/&quot; rel=&quot;tag&quot;&gt;Office&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Software"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2429/Modificare-PDF.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2429/Modificare-PDF.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2429.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2429</trackback:ping></entry><entry><title>Mono e Framework... un po' di semplici benchmark</title><id>http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx</id><updated>2008-10-28T08:29:50+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2419' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;&lt;em&gt;&amp;quot;Ma prestazionalmente, sulla stessa macchina, quant'&#232; la differenza tra un'applicazione che gira sul Framework e sistema operativo Microsoft e la stessa su Linux con Mono?&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa era una richiesta che mi era stata fatta parecchio tempo fa, ma per questione di voglia o altro non l'avevo mai fatta. Allora ho scritto una semplice &lt;em&gt;windows forms&lt;/em&gt; che facesse delle operazioni ripetute su questi semplici scenari:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Calcolo con interi: banale calcolo con soli numeri interi.&lt;/li&gt; &lt;li&gt;Calcolo con decimal: come sopra, ma con l'uso dei decimali.&lt;/li&gt; &lt;li&gt;Lettura completa di un documento &lt;em&gt;xml&lt;/em&gt; da 300KB e 44.000 nodi, con il &lt;em&gt;SelectNodes&lt;/em&gt;, nodo per nodo.&lt;/li&gt; &lt;li&gt;Apertura ripetuta dello stesso documento &lt;em&gt;xml&lt;/em&gt; ripetutamente con ricerca di nodi all'interno dello stesso.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Innanzitutto vediamo l'applicazione in esecuzione:&lt;/p&gt; &lt;p&gt;&lt;img height=&quot;402&quot; alt=&quot;schermata-benchmark .net2&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/monoeframework.unpodisemplicibenchmark_8355/schermata-benchmark%20.net2_3.png&quot; width=&quot;385&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt;E su Linux con Mono:&lt;/p&gt; &lt;p&gt;&lt;img height=&quot;427&quot; alt=&quot;schermata-benchmark .net mono&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/monoeframework.unpodisemplicibenchmark_8355/schermata-benchmark%20.net_3.png&quot; width=&quot;387&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt;Riassumendo i risultati in una tabella:&lt;/p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; border=&quot;0&quot;&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width=&quot;80&quot;&gt;&amp;nbsp;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;strong&gt;Integer&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;strong&gt;Double&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;strong&gt;Xml 1&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;strong&gt;Xml 2&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;&lt;strong&gt;Windows .net&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;453,125s&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;1859,375s&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;46,875s&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;4640,625s&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;&lt;strong&gt;Mono&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;499,71s&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;2362.398s&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;259,891s&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;80&quot;&gt;&lt;em&gt;26959,493s&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;NB:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;La piccola applicazione &#232; stata scritta con &lt;em&gt;Visual Studio 2008&lt;/em&gt; per il&lt;em&gt; Framework 2.0&lt;/em&gt;.&lt;/li&gt; &lt;li&gt;Il computer su cui girava &lt;em&gt;Mono&lt;/em&gt; aveva &lt;em&gt;Ubuntu&lt;/em&gt; 8.10 RC.&lt;/li&gt; &lt;li&gt;Ho potuto usare solo la versione 1.9 di &lt;em&gt;Mono&lt;/em&gt; e non la nuova 2.0, ma purtroppo non potevo testare la nuova versione sul computer a disposizione.&lt;/li&gt; &lt;li&gt;Notare le piccole imperfezioni grafiche della versione &lt;em&gt;Mono&lt;/em&gt;, teoricamente risolte con la nuova versione.&lt;/li&gt; &lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Mono/&quot; rel=&quot;tag&quot;&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Mono"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2419.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2419</trackback:ping></entry><entry><title>GTK, giusta crocevia tra piattaforme?</title><id>http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx</id><updated>2008-10-26T12:57:50+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2414' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Non ho mai fatto segreto della mia passione per &lt;em&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://it.wikipedia.org/wiki/mono_(progetto)&quot;&gt;Mono&lt;/a&gt;&lt;/em&gt;, porting del &lt;em&gt;Framework .Net&lt;/em&gt; su sistemi operativi non &lt;em&gt;Microsoft&lt;/em&gt;. Passi da gigante sono stati fatti per la compatibilit&#224; delle stesse applicazioni su sistemi operativi differenti, soprattutto per applicazioni desktop (sono fondamentalmente contro all'utilizzo di questo porting per webapplication, visto che il risparmio dovuto ad hosting e licenze dei sistemi operativi sia ridicolo di fronte allo sforzo per la realizzazione di web application che girino perfettamente con Mono - ma questo &#232; assolutamente IMHO!).&lt;/p&gt; &lt;p&gt;Da qualche giorno &#232; uscita la versione 2.0 di &lt;a title=&quot;link esterno&quot; href=&quot;http://www.mono-project.com/main_page&quot;&gt;&lt;em&gt;Mono&lt;/em&gt;&lt;/a&gt;. E' aumentata notevolmente la compatibilit&#224; con le applicazini scritte con il Framework nativo della &lt;em&gt;Microsoft&lt;/em&gt;. Ora &#232; possibile lanciare moltissime applicazioni &lt;em&gt;windows forms&lt;/em&gt; su &lt;em&gt;Linux&lt;/em&gt; con &lt;em&gt;Mono&lt;/em&gt; senza trovare grosse differenze e problematiche nell'uso dell'interfaccia grafica (cosa che avveniva in modo pesante con la versione 1.2 e, in modo minore, con la 1.9.1).&lt;/p&gt; &lt;p&gt;Nel poco tempo che riesco a dedicare a &lt;em&gt;Mono&lt;/em&gt; per miei test, ho trovato ideale l'utilizzo di una libreria esterna per la creazione e l'utilizzo delle interfacce grafiche, compatibile con entrambi i mondi, Windows e Linux. E' il progetto &lt;a title=&quot;link esterno&quot; href=&quot;http://www.mono-project.com/gtksharp&quot;&gt;Gtk#&lt;/a&gt;, libreria che permette l'utilizzo di &lt;a title=&quot;link esterno&quot; href=&quot;http://www.gtk.org/&quot;&gt;Gtk+&lt;/a&gt; che, ricordo, &#232; la libreria grafica utilizzata dal &lt;em&gt;Desktop environment&lt;/em&gt;, &lt;em&gt;Gnome&lt;/em&gt;. Inoltre &#232; utilizzata gi&#224; con successo da molti altri programmi multi piattaforma, come &lt;em&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://www.pidgin.im/&quot;&gt;Pidgin&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Il suo utilizzo in applicazioni .&lt;em&gt;Net&lt;/em&gt; su sistemi operativi &lt;em&gt;Linux&lt;/em&gt; non necessita di alcuno sforzo visto che nel caso di &lt;em&gt;Gnome&lt;/em&gt; &#232; gi&#224; installata la libreria &lt;em&gt;Gtk&lt;/em&gt;, nel caso di altri &lt;em&gt;Desktop environment&lt;/em&gt; - &lt;em&gt;Kde&lt;/em&gt; - &#232; sufficiente installare tale libreria. Installazione necessaria anche sotto &lt;em&gt;Windows&lt;/em&gt; da questo &lt;a title=&quot;link esterno&quot; href=&quot;http://gladewin32.sourceforge.net/&quot;&gt;link&lt;/a&gt; da dove si devono scaricare sia la libreria &lt;em&gt;Gtk+&lt;/em&gt;, sia &lt;em&gt;Glade&lt;/em&gt;, e infine la &lt;a title=&quot;link esterno&quot; href=&quot;http://developer.novell.com/wiki/index.php/special:downloads/gtk-sharp/gtk-sharp~~~runtime&quot;&gt;Gtk#&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;La costruzione dell'interfacce grafica &#232; semplice, grazie a programmi appositi, come &lt;em&gt;Glade&lt;/em&gt; (programma scaricato prima), che permette la creazione di interfacce grafiche in modo molto simile a &lt;em&gt;Visual Studio&lt;/em&gt;. L'output di questo programma &#232; un &lt;em&gt;xml&lt;/em&gt; che, incluso nel nostro progetto con &lt;em&gt;Visual Studio&lt;/em&gt; definito come &quot;&lt;em&gt;Embedded Resource&lt;/em&gt;&quot; utilizzeremo in questo modo:&lt;/p&gt; &lt;p&gt;&lt;em&gt;public GtkApp(string []args)&lt;br /&gt; {&lt;br /&gt; Application.Init(); &lt;br /&gt; Glade.XML gxml = new Glade.XML (null, &quot;googleSearch.googlesearch.glade&quot;, &lt;br /&gt; &quot;mainWindow&quot;, null);&lt;br /&gt; gxml.Autoconnect (this);&lt;br /&gt; mainWindow.DeleteEvent+=new DeleteEventHandler(mainWindow_DeleteEvent);&lt;br /&gt; btnSearch.Clicked+=new EventHandler(btnSearch_Clicked);&lt;br /&gt; btnClear.Clicked+=new EventHandler(btnClear_Clicked);&lt;br /&gt; Application.Run();&lt;br /&gt; }&lt;/em&gt; &lt;p&gt;Un esempio completo (da cui ho preso questa porzione di codice) lo si trova in questa pagina di &lt;em&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://www.codeproject.com/kb/cross-platform/googlesearch.aspx&quot;&gt;CodeProject&lt;/a&gt;&lt;/em&gt;. Dopo aver caricato l'interfaccia grafica si connette da codice gli eventi agli oggetti come i button all'interno dell'interfaccia grafica. Tutto fatto.&lt;/p&gt; &lt;p&gt;Abbiamo a disposizione altre interfacce grafiche comuni tra i sistemi operativi, come la famosa libreria &lt;em&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://www.wxwidgets.org/&quot;&gt;wxwidgets&lt;/a&gt;&lt;/em&gt; e il suo porting in &lt;em&gt;.Net&lt;/em&gt;, &lt;em&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://wxnet.sourceforge.net/&quot;&gt;wxwidgets.net&lt;/a&gt;&lt;/em&gt;. Potente flessibile, ma ha grossi problemi di stabilit&#224; almeno sotto &lt;em&gt;windows&lt;/em&gt; dove &lt;strong&gt;crolla&lt;/strong&gt; spesso e volentieri in errori inspiegabili - almeno per me.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Mono/&quot; rel=&quot;tag&quot;&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Mono"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2414.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2414</trackback:ping></entry><entry><title>Excel e i formati aperti</title><id>http://blogs.aspitalia.com/az/post2413/Excel-Formati-Aperti.aspx</id><updated>2008-10-25T12:00:18+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2413' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Questa settimana ho dovuto lavorare parecchio con &lt;em&gt;Excel&lt;/em&gt;. Ma non nella costruzione di fogli con il programma &lt;em&gt;Excel&lt;/em&gt; per inserire le formulette o per creare grafici, ma per la sua gestione &lt;strong&gt;dal di fuori&lt;/strong&gt; con codice .Net in un ameno &lt;em&gt;CRUD&lt;/em&gt; - &#232; applicabile anche fuori dal mondo dei db questo acronimo? Non sono un purista delle terminologia e dunque non me ne frega nulla.&lt;/p&gt; &lt;p&gt;Vediamo un po' le risorse a nostra disposizione senza componenti da installare su un server per leggere e scrivere nel formato .xls di &lt;em&gt;Excel&lt;/em&gt;. Innanzitutto partiamo dalla creazione. Abbiamo tre grosse e facili strade:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Tabella html.&lt;/li&gt; &lt;li&gt;Xml&lt;/li&gt; &lt;li&gt;Oledb&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;La prima strada &#232; la pi&#249; semplice ma assolutamente non permette alcuna configurazione. In poche parole scordiamoci l'inserimento di formule e formattazioni strane. Il contenuto della tabella sar&#224; importata cos&#236; com'&#232;, nulla di pi&#249;, nulla di meno.&lt;/p&gt; &lt;p&gt;L'xml si pu&#242; dividere in due categorie: quello contenente solo i dati di &lt;em&gt;Excel&lt;/em&gt; e quello che rappresenta sia i dati sia la formattazione. Nel primo caso non abbiamo niente di differente dalla tabella html prima citata, mentre nel secondo caso abbiamo pressocch&#233; tutte le potenzialit&#224; di &lt;em&gt;Excel&lt;/em&gt; a disposizione: formattazione, formule, &lt;em&gt;multi-sheet&lt;/em&gt; e cos&#236; via... L'unica limitazione che ho trovato &#232; nell'impossibilit&#224; di bloccare con password gli elementi presenti nel documento. Questo formato &#232; molto semplice. Per poterlo vedere &#232; sufficiente salvare un qualsiasi documento &lt;em&gt;Excel&lt;/em&gt; in formato &lt;em&gt;Xml&lt;/em&gt; e aprirlo con un qualsiasi editor:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;?mso-application progid=&quot;Excel.Sheet&quot;?&amp;gt;&lt;br /&gt;&amp;lt;Workbook xmlns:c=&quot;urn:schemas-microsoft-com:office:component:spreadsheet&quot;&lt;br /&gt; xmlns:html=&quot;&lt;/em&gt;&lt;a href=&quot;http://www.w3.org/tr/rec-html40&amp;quot;&quot;&gt;&lt;em&gt;http://www.w3.org/TR/REC-html40&quot;&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt; xmlns:o=&quot;urn:schemas-microsoft-com:office:office&quot;&lt;br /&gt; xmlns:xsi=&quot;&lt;/em&gt;&lt;a href=&quot;http://www.w3.org/2001/xmlschema-instance&amp;quot;&quot;&gt;&lt;em&gt;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt; xmlns=&quot;urn:schemas-microsoft-com:office:spreadsheet&quot;&lt;br /&gt; xmlns:x2=&quot;&lt;/em&gt;&lt;a href=&quot;http://schemas.microsoft.com/office/excel/2003/xml&amp;quot;&quot;&gt;&lt;em&gt;http://schemas.microsoft.com/office/excel/2003/xml&quot;&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt; xmlns:ss=&quot;urn:schemas-microsoft-com:office:spreadsheet&quot;&lt;br /&gt; xmlns:x=&quot;urn:schemas-microsoft-com:office:excel&quot;&amp;gt;&lt;br /&gt; &amp;lt;OfficeDocumentSettings xmlns=&quot;urn:schemas-microsoft-com:office:office&quot;&amp;gt;&lt;br /&gt; &amp;lt;Colors&amp;gt;&lt;br /&gt; &amp;lt;Color&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;/Color&amp;gt;&lt;br /&gt; &amp;lt;/Colors&amp;gt;&lt;br /&gt; &amp;lt;/OfficeDocumentSettings&amp;gt;&lt;br /&gt; &amp;lt;ExcelWorkbook xmlns=&quot;urn:schemas-microsoft-com:office:excel&quot;&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;/ExcelWorkbook&amp;gt;&lt;br /&gt; &amp;lt;Styles&amp;gt;&lt;br /&gt; &amp;lt;Style ss:ID=&quot;Default&quot; ss:Name=&quot;Default&quot;/&amp;gt;...&lt;br /&gt; &amp;lt;/Styles&amp;gt;&lt;br /&gt; &amp;lt;ss:Worksheet ss:Name=&quot;Foglio1&quot;&amp;gt;&lt;br /&gt; &amp;lt;Table ss:StyleID=&quot;ta1&quot;&amp;gt;&amp;lt;Column ss:Width=&quot;64.2614&quot;/&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type=&quot;String&quot;&amp;gt;Titolo&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type=&quot;Number&quot;&amp;gt;12&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type=&quot;Number&quot;&amp;gt;32&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell&amp;gt;&amp;lt;Data ss:Type=&quot;Number&quot;&amp;gt;43&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell ss:Formula=&quot;of:=SUM([.A2:.A4])&quot;&amp;gt;&amp;lt;Data ss:Type=&quot;Number&quot;&amp;gt;87&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;/Table&amp;gt;&amp;lt;x:WorksheetOptions/&amp;gt;&lt;br /&gt; &amp;lt;/ss:Worksheet&amp;gt;&lt;br /&gt; &amp;lt;ss:Worksheet ss:Name=&quot;Foglio2&quot;&amp;gt;&lt;br /&gt; &amp;lt;Table ss:StyleID=&quot;ta1&quot;&amp;gt;&amp;lt;Column ss:Width=&quot;64.2614&quot;/&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell ss:Index=&quot;1&quot;/&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;/Table&amp;gt;&amp;lt;x:WorksheetOptions/&amp;gt;&lt;br /&gt; &amp;lt;/ss:Worksheet&amp;gt;&lt;br /&gt; &amp;lt;ss:Worksheet ss:Name=&quot;Foglio3&quot;&amp;gt;&lt;br /&gt; &amp;lt;Table ss:StyleID=&quot;ta1&quot;&amp;gt;&amp;lt;Column ss:Width=&quot;64.2614&quot;/&amp;gt;&amp;lt;Row ss:Height=&quot;12.8409&quot;&amp;gt;&amp;lt;Cell ss:Index=&quot;1&quot;/&amp;gt;&amp;lt;/Row&amp;gt;&amp;lt;/Table&amp;gt;&amp;lt;x:WorksheetOptions/&amp;gt;&lt;br /&gt; &amp;lt;/ss:Worksheet&amp;gt;&lt;br /&gt;&amp;lt;/Workbook&amp;gt;&lt;/em&gt; &lt;p&gt;L'ultima tecnica a disposizione &#232; grazie all'uso dell'&lt;em&gt;oledb&lt;/em&gt;. Proprio come fosse un database, possiamo creare un foglio di &lt;em&gt;excel&lt;/em&gt;, i singoli fogli e il contenuto tabellare. E' sufficiente usare una stringa di connessione come la seguente per accedere in lettura o, se non esiste, per creare un documento &lt;em&gt;Excel&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;string conn=&quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Document.xls;Extended Properties = \&quot;Excel 8.0;HDR=YES;\&quot;&quot;;&lt;/em&gt; &lt;p&gt;Per leggere si usano i soliti comando &lt;em&gt;sql-like&lt;/em&gt;: &lt;p&gt;&lt;em&gt;select * from [Sheet1$]&lt;/em&gt; &lt;p&gt;Cos&#236; anche per l'inserimento: &lt;p&gt;&lt;em&gt;inert into [Sheet1$](NomeColonna1,NomeColonna2) values(1,2)&lt;/em&gt; &lt;p&gt;Per creare un nuovo &lt;em&gt;sheet&lt;/em&gt;: &lt;p&gt;&lt;em&gt;create table [AZFoglio](Colonna1 int, Colonna2 text)&lt;/em&gt; &lt;p&gt;Il problema &#232; la cancellazione di un &lt;em&gt;sheet&lt;/em&gt;. Questo comando non elimina lo &lt;em&gt;sheet&lt;/em&gt; dal documento, ma semplicemente lo svuota: &lt;p&gt;&lt;em&gt;drop table [AZFoglio]&lt;/em&gt; &lt;p&gt;Altra nota negativa non di poco conto? La cancellazione di righe non &#232; supportata! &lt;p&gt;Inoltre, tutti gli &lt;em&gt;sheet&lt;/em&gt; creati all'interno di &lt;em&gt;Excel&lt;/em&gt; avranno il simbolo del dollaro in automatico alla fine del nome (importante saperlo perch&#233; il simbolo &#232; necessario per le query in &lt;em&gt;oledb&lt;/em&gt;), mentre quelli creati da &lt;em&gt;Oledb&lt;/em&gt;, non sar&#224; necessario. &lt;p&gt;Molto comodo questo tipo di accesso, ma ci mette subito di fronte all'impossibilit&#224; di inserire alcunch&#233; al di fuori di dati tabellari. Inoltre, l'&lt;em&gt;Oledb&lt;/em&gt; ha un modo particolare per capire il tipo di dato presente in una colonna in un documento &lt;em&gt;Excel&lt;/em&gt;: legge le prime otto righe per ogni colonna, e da un media tutta sua, valuta il tipo che sar&#224; contenuto. Questo cosa comporta? Semplice, un macello se prepariamo un documento &lt;em&gt;Excel&lt;/em&gt; contenente solo il nome delle colonne e senza alcun dato perch&#233; popolata dal nostro codice. Il perch&#233;? Intuibile. &lt;em&gt;Oledb&lt;/em&gt; vedendo solo il nome di colonna - una stringa - penser&#224; che il tipo &#232; di tipo &lt;em&gt;text&lt;/em&gt;. &lt;p&gt;Altro grave problema. Se il classico operatore che non sa distinguere &lt;em&gt;Excel&lt;/em&gt; da un tostapane, inserisce i dati come numeri e poi testo, il tipo non corrispondente a quello calcolato dalla media all'apertura del documento, sar&#224; ignorato. &lt;p&gt;Visto che sono saltato a pi&#232; pari alla lettura, qualsiasi persona potrebbe pensare di creare il documento &lt;em&gt;Excel&lt;/em&gt; in formato &lt;em&gt;Xml&lt;/em&gt; e poi leggerlo con &lt;em&gt;Oledb&lt;/em&gt;... MAGARI! No, non &#232; possibile. &lt;em&gt;Oledb&lt;/em&gt; &#232; in grado di accedere ai documenti &lt;em&gt;Excel&lt;/em&gt; salvati nel suo formato originale. Bel casino. E per leggere un documento &lt;em&gt;Excel&lt;/em&gt; salvato in formato &lt;em&gt;Xml&lt;/em&gt;? Semplice, si usa il classo &lt;em&gt;XmlDocument&lt;/em&gt; o classi simili! E sempre per aggiungere righe, modificare colonne e altro, ci si deve affidare a oggetti adatti alla trattazione di documenti &lt;em&gt;Xml&lt;/em&gt;. &lt;p&gt;In rete sono disponibili vari oggetti per la lettura/scrittura di documenti Excel. Per esempio: &lt;ul&gt; &lt;li&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://www.codeproject.com/kb/office/excelreader.aspx&quot;&gt;ExcelReader&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title=&quot;link esterno&quot; href=&quot;http://www.carlosag.net/tools/excelxmlwriter/&quot;&gt;CarlosAg Excel Xml Writer Library&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Il primo &#232; in grado di leggere in modo perfetto (bel superiore all'&lt;em&gt;Oledb&lt;/em&gt;) qualsiasi documento salvato in formato &lt;em&gt;Excel&lt;/em&gt;, ma non documenti creati in &lt;em&gt;Xml&lt;/em&gt;. La seconda classe crea un documento Excel in modo molto semplice e intuitivo, ma solo in formato &lt;em&gt;Xml&lt;/em&gt;. Uomo avvisato...&lt;/p&gt; &lt;p&gt;Ma dopo tutto questo personale chiacchiericcio, qual &#232; la morale? Innanzitutto ho voluto darei posteri questa mia esperienza in modo che altri possano perdere meno tempo in test come ho fatto io, e poi... Quando si butteranno via i formati proprietari di &lt;em&gt;Excel,&lt;/em&gt; &lt;em&gt;Word&lt;/em&gt; e - perch&#233; no? - &lt;em&gt;Pdf&lt;/em&gt;, e non si usano definitivamente quelli aperti come quello di &lt;em&gt;Office 2007&lt;/em&gt; o di &lt;em&gt;OpenOffice&lt;/em&gt;? E pensare come sarebbe bello! La fine dell'utilizzo di oggetti esterni e carissimi per gestire questi formati, basta installazioni di oggetti &lt;em&gt;COM&lt;/em&gt; per la loro trattazione.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Questo &#232; uno sfogo personale!&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;E non centra nulla con il fatto che oggi &#232; il Linux Day. A proposito, sui miei computer ecco i sistemi operativi che uso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Windows 2003 (in attesa di essere sostituito da &lt;em&gt;Windows&lt;/em&gt; &lt;em&gt;2008&lt;/em&gt; appena avr&#242; una nuova macchina, i miei due &lt;em&gt;SO&lt;/em&gt; preferiti made in &lt;em&gt;Microsoft&lt;/em&gt;).&lt;/li&gt; &lt;li&gt;Arch Linux (la mia distribuzione &lt;em&gt;Linux&lt;/em&gt; preferita).&lt;/li&gt; &lt;li&gt;Windows Xp SP3 (affidabilissimo anche sul quel mio catenaccio di portatile).&lt;/li&gt; &lt;li&gt;Ubuntu 8.4 (riesce a farmi funzionare tutto sul portatile).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Office/&quot; rel=&quot;tag&quot;&gt;Office&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Imho"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2413/Excel-Formati-Aperti.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2413/Excel-Formati-Aperti.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2413.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2413</trackback:ping></entry><entry><title>Io... e il mio tempo</title><id>http://blogs.aspitalia.com/az/post2408/Io.-Tempo.aspx</id><updated>2008-10-18T12:58:06+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2408' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Sar&#224;... avr&#224; ragione la gente. Mi dicono che ho un caratteraccio. Qualcuno si stupisce di certi miei comportamenti. Eppure a me sembra chiaro. Vivo con il costrutto &lt;em&gt;vivi e lascia vivere...&lt;/em&gt; Ma quello che non sopporto sono quelli che pensano di sapere i fatti degli altri, di avere titolo per elargire buoni consigli. Ma che ne sai di quello che penso, faccio, desidero e odio? Io accetto le critiche, ma da persone che &lt;em&gt;sanno chi sono&lt;/em&gt; e &lt;em&gt;che mi conoscono.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Faccio un esempio altrimenti non vengo capito. Prendiamo questa &lt;a href=&quot;http://blogs.msdn.com/scoriani/archive/2008/10/18/storie-di-successo-con-nhibernate.aspx&quot;&gt;critica&lt;/a&gt; mossa su un mio &lt;a href=&quot;http://blogs.aspitalia.com/az/post2404/podi-benchmark-linq-entity-framework-nhibernate.aspx&quot;&gt;blog&lt;/a&gt; precedente. Mi chiedo: costui che titolo ha di criticare ci&#242; che scrivo il quel suo blog stantio alla ricerca del solito sensazionalismo, aggiungendo in coda la seguente frase?&lt;/p&gt; &lt;p&gt;&lt;em&gt;PS per la serie.. c'&#232; gente che ha tanto tempo da &lt;/em&gt;&lt;a href=&quot;http://blogs.aspitalia.com/az/post2404/podi-benchmark-linq-entity-framework-nhibernate.aspx&quot;&gt;&lt;em&gt;perdere&lt;/em&gt;&lt;/a&gt;&lt;em&gt; in cose veramente poco utili e obiettive.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Cos&#236; come io ho fatto dei test e ho dimostrato alcune cose, secondo me utili e motivate, mi piacerebbe che anche tu facessi lo stesso nei miei confronti, in modo che possa capire, se e dove, ho sbagliato nelle mie considerazioni. Ti ricordo inoltre che i prodotti, di qualsiasi azienda non solo di Microsoft, conquistano il mercato e si impogono, non tanto perch&#232; c'&#232; un Evangelist qualsiasi (che ho sempre considerato figura tecnica e non markettaro) che sostiene velatamente, &quot;che i nostri prodotti sono i migliori e gli altri fanno schifo&quot; ma perch&#232; sono effettivamente, concretamente e oggettivamente migliori di altri. Sarebbe troppo facile se tutti i clienti abboccassero cos&#236; all'amo. &lt;p&gt;P.S.&lt;br /&gt;Io non sono obbiettivo e dico cose poco utili? Un evangelist Microsoft dice a me che non sono obbiettivo? Era una battuta, vero?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Imho"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2408/Io.-Tempo.aspx"/><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2408/Io.-Tempo.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2408.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2408</trackback:ping></entry><entry><title>BackgroundWorker e le windows forms</title><id>http://blogs.aspitalia.com/az/post2407/BackgroundWorker-Windows-Forms.aspx</id><updated>2008-10-17T06:54:18+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2407' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Apprezzo moltissimo questo oggetto introdotto nella versione 2.0 del framework quando devo scrivere delle windows forms tradizionali con il Framework. Chi ha esperienza di programmazione delle windows application con .net, sapr&#224; del famoso &lt;em&gt;freezing&lt;/em&gt; che colpisce l'applicazione in caso di operazioni lunghe/pesanti se tale codice viene elaborato da un evento (click su un button o simile).&lt;/p&gt; &lt;p&gt;Fin dalla versione 1.0 per evitare questo inconveniente era necessario armarsi di delegate e pazienza, e con il classico inconveniente di non poter aggiorare l'interfaccia grafica in caso di utilizzo di questa tecnica se non con l'uso di altri artefizi. Ma veniamo al dunque. Creata una windows forms con un button e una label, voglio fare in modo che alla pressione del button venga visualizzato il messaggio di attesa, e solo alla fine dell'operazione vedere il risultato.&lt;/p&gt; &lt;p&gt;Con il BackgrounWorker la cosa &#232; semplice, anzi, possiamo anche aggiornare l'interfaccia grafica durante l'elaborazione e con poco altro codice permettere il blocco dell'operazione.&lt;/p&gt; &lt;p&gt;&lt;em&gt;backgroundWorker1.DoWork += backgroundWorker1_DoWork; &lt;br /&gt;backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; &lt;br /&gt;backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Nella prima riga specifico quale evento sar&#224; chiamato quando dovr&#224; essere avviata l'operazione &lt;em&gt;pesante&lt;/em&gt;. La seconda sar&#224; chiamata alla fine della &lt;em&gt;pesante&lt;/em&gt; operazione. La terza, che possiamo invocare noi dal primo evento, per aggiornare eventualmente l'interfaccia grafica. S&#236;, perch&#233; solo questo evento e il secondo potranno aggiornare l'interfaccia grafica. &lt;/p&gt; &lt;p&gt;&lt;em&gt;backgroundWorker1.WorkerReportsProgress = true; &lt;br /&gt;backgroundWorker1.WorkerSupportsCancellation = true; &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Queste righe, invece, attivano la possibilit&#224; di &lt;em&gt;avviare&lt;/em&gt; il terzo evento e di poter &lt;em&gt;bloccare&lt;/em&gt; le operazioni da interfaccia utente. Obbligatori, sono solo l'evento &lt;em&gt;DoWork&lt;/em&gt; e &lt;em&gt;RunWorkerCompleted&lt;/em&gt;. &lt;/p&gt; &lt;p&gt;Ma &#232; ora di cominciare. Ecco l'evento del &lt;em&gt;Button&lt;/em&gt; nella pagina: &lt;/p&gt; &lt;p&gt;&lt;em&gt;private void button1_Click(object sender, EventArgs e) &lt;br /&gt;{ &lt;br /&gt;&lt;/em&gt;&lt;/p&gt; &lt;em&gt;&lt;em&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disabilito il button di avvio &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; button1.Enabled=false; &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Abilito il button di cancel &lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; button2.Enabled=true; &lt;br /&gt;&lt;/em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; backgroundWorker1.RunWorkerAsync(100); &lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Possiamo passare un parametro facoltativo al nostro codice, di qualsiasi tipo. Per&#242; innanzitutto disabilitiamo il button in modo che non si possa cliccare pi&#249; volte sopra di esso. Con il method &lt;em&gt;RunWorkerAsync&lt;/em&gt;, avviamo il codice presente nell'evento &lt;em&gt;DoWork&lt;/em&gt;. &lt;/p&gt; &lt;p&gt;&lt;em&gt;void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Leggo il parametro &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int val = int.Parse(e.Argument.ToString()); &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Richiedo il Backgroundworker che ha richiamato l'evento &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // per poter richiamare l'evento per l'aggiornamento &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BackgroundWorker worker = sender as BackgroundWorker; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; val; i += 1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Richiama l'evento memorizzato in ProgressChanged &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Questo evento accetta come parametro un valore &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // compreso da 0 a 100 (%) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; worker.ReportProgress(i); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Threading.Thread.Sleep(40); &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Controllo se &#232; stato premuto il button di Cancel &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (worker.CancellationPending) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Cancel = true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Infine passo l'eventuale risultato all'evento finale &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Result = DateTime.Now; &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Per aggiornare la window durante l'elaborazione viene utilizzato il method &lt;em&gt;ReportProgress&lt;/em&gt; che accetta come parametro un intero compreso tra &lt;em&gt;zero&lt;/em&gt; e &lt;em&gt;cento&lt;/em&gt; (percentuale di elaborazione). Ecco il codice usato dall'esempio: &lt;/p&gt; &lt;p&gt;&lt;em&gt;void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visualizzo aggionamento percentuale nella label &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; label1.Text = string.Format(&amp;quot;{0}%&amp;quot;, e.ProgressPercentage); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Interessante, di questo evento, che possiamo aggiornare qualsiasi oggetto nella &lt;em&gt;window&lt;/em&gt;, anche &lt;em&gt;datagridview&lt;/em&gt; con il simpatico effeto grafico di popolamento dello stesso. Non potendolo passare come parametro &#232; sufficiente definire la fonte dati dello stesso come &lt;em&gt;property&lt;/em&gt; nella classe della pagina, &lt;/p&gt; &lt;p&gt;Ed ecco il codice eseguito automaticamente alla fine di questo codice: &lt;/p&gt; &lt;p&gt;&lt;em&gt;void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Controllo se l'operazione &#232; stata bloccata dall'utente &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.Cancelled) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label1.Text = &amp;quot;Operation Cancelled&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&lt;/em&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visualizzo la data passata dalla elaborazione &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime dt = DateTime.Parse(e.Result.ToString()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label1.Text = dt.ToString(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Riattivo il button di avvio &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; button1.Enabled = true; &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // E disabilito il button di cancel &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; button2.Enabled = false; &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;L'operazione di &lt;em&gt;Cancel&lt;/em&gt; &#232; collegato con un normale evento di &lt;em&gt;button2:&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;private void button2_Click(object sender, EventArgs e) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; backgroundWorker1.CancelAsync(); &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Banalmente, segnala al nostro oggetto che &#232; stata richiesta la fine dell'elaborazione del nostro codice. Questo lo possiamo controllare, come si vede sopra, controllando l'evento &lt;em&gt;CancellationPending&lt;/em&gt;. Ovviamente questo operazione &#232; controllabile solo se &#232; in elaborazione il nostro codice. Eventuale richieste pesanti al DB non potranno essere bloccate fino alla restituzione dei dati (senza scomodare ancora i delegate asincroni). &lt;/p&gt; &lt;p&gt;Me lo sono segnato.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Client/&quot; rel=&quot;tag&quot;&gt;Windows Client&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Memo"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2407/BackgroundWorker-Windows-Forms.aspx"/><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2407/BackgroundWorker-Windows-Forms.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2407.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2407</trackback:ping></entry><entry><title>Un po' di benchmark tra Linq, Entity Framework e Nhibernate</title><id>http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx</id><updated>2008-10-12T12:46:17+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2404' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In un &lt;a href=&quot;http://blogs.aspitalia.com/az/post2368/sp-linq-entity-framework-scrittura.aspx&quot;&gt;blog&lt;/a&gt; di qualche tempo fa avevo messo a confronto le prestazioni tra &lt;em&gt;Linq&lt;/em&gt; e l'&lt;em&gt;Entity Framework&lt;/em&gt; in scrittura (e lettura). Anche in questo caso moltissime persone (una) mi hanno chiesto come si comportasse &lt;em&gt;Nhibernate&lt;/em&gt; nel confronto.&lt;/p&gt; &lt;p&gt;Innanzitutto, prima di sentenziare verit&#224; assolute che non possiedo, premetto che NON sono affatto un esperto di &lt;em&gt;Nhibernate&lt;/em&gt;: con esso ho solo &lt;em&gt;giocato&lt;/em&gt; in piccole applicazioni di test per testare le prestazioni di questo famoso e ottimo &lt;em&gt;ORM&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Per evitare discussioni riposto la struttura del database e i file di configurazione utilizzati nel mio test, in modo che gente pi&#249; esperta di me di questo &lt;em&gt;ORM&lt;/em&gt;, possa segnalarmi eventuali errori:&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;struttura tabelle&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/spvslinqvsentityframeworkinscrittura_141e2/image_1.png&quot; /&gt;&lt;/p&gt; &lt;p&gt;Ed ecco i file di mapping usati per Nhibernate. Per la tabella &lt;em&gt;Padri&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot;&lt;br /&gt; assembly=&quot;EntitiesX&quot;&lt;br /&gt; namespace=&quot;EntitiesX&quot;&lt;br /&gt; default-lazy=&quot;false&quot;&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;class name=&quot;Padri&quot; table=&quot;Padri&quot;&amp;gt;&lt;br /&gt; &amp;lt;id name=&quot;Id&quot; unsaved-value=&quot;0&quot; &amp;gt;&lt;br /&gt; &amp;lt;generator /&amp;gt;&lt;br /&gt; &amp;lt;/id&amp;gt; &lt;br /&gt; &amp;lt;property name=&quot;NomePadre&quot; /&amp;gt; &lt;br /&gt; &amp;lt;bag name=&quot;Figli&quot; cascade=&quot;all-delete-orphan&quot;&lt;br /&gt; generic=&quot;true&quot; lazy=&quot;false&quot; inverse=&quot;true&quot;&lt;br /&gt; fetch=&quot;join&quot;&amp;gt;&lt;br /&gt; &amp;lt;key column=&quot;IdPadre&quot; /&amp;gt;&lt;br /&gt; &amp;lt;one-to-many /&amp;gt;&lt;br /&gt; &amp;lt;/bag&amp;gt;&lt;br /&gt; &amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/em&gt; &lt;p&gt;Per la tabella &lt;em&gt;Figli&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot;&lt;br /&gt; assembly=&quot;EntitiesX&quot;&lt;br /&gt; namespace=&quot;EntitiesX&quot;&lt;br /&gt; default-lazy=&quot;false&quot;&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;class name=&quot;Figli&quot; table=&quot;Figli&quot;&amp;gt;&lt;br /&gt; &amp;lt;id name=&quot;Id&quot; unsaved-value=&quot;0&quot; &amp;gt;&lt;br /&gt; &amp;lt;generator /&amp;gt;&lt;br /&gt; &amp;lt;/id&amp;gt; &lt;br /&gt; &amp;lt;property name=&quot;NomeFiglio&quot; /&amp;gt;&lt;br /&gt; &amp;lt;many-to-one name=&quot;Padri&quot; column=&quot;IdPadre&quot; /&amp;gt;&lt;br /&gt; &amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/em&gt; &lt;p&gt;Per l'inserimento ho usato questo banale codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (ISession session =sessionFactory.OpenSession() )&lt;br /&gt;{&lt;br /&gt; foreach (var padre in coll) session.SaveOrUpdate(padre);&lt;br /&gt; session.Flush();&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Come nel blog precedente, innanzitutto sono state create cento &lt;em&gt;entity Padri&lt;/em&gt;, con ognuna di essa cento &lt;em&gt;entity Figli&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Ecco la tabella prestazionale definitiva (rifatta con il carico attuale del computer):&lt;/p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;500&quot; border=&quot;1&quot; unselectable=&quot;on&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width=&quot;125&quot;&gt;&lt;strong&gt;Stored procedure&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;125&quot;&gt;&lt;strong&gt;Linq To Sql&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;125&quot;&gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;125&quot;&gt;&lt;strong&gt;Nhibernate&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width=&quot;125&quot;&gt;6.85s&lt;/td&gt; &lt;td  width=&quot;125&quot;&gt;24,10&lt;/td&gt; &lt;td  width=&quot;125&quot;&gt;14,68&lt;/td&gt; &lt;td  width=&quot;125&quot;&gt;13,87&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Nhibernate, dall'alto dei suoi anni di sviluppo, batte entrambe le tecnologie Microsoft anche se di poco.&lt;/p&gt; &lt;p&gt;Ora vediamo come si portano tutti in lettura. Il codice ripopola tutti gli oggetti con il contenuto delle tabelle. Nel caso di &lt;em&gt;Nhibernate&lt;/em&gt;, il codice &#232; il seguente:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (ISession session = sessionFactory.OpenSession())&lt;br /&gt;{&lt;br /&gt; IList&amp;lt;EntitiesX.Padri&amp;gt; coll=session.CreateCriteria(typeof(EntitiesX.Padri)).List&amp;lt;EntitiesX.Padri&amp;gt;();&lt;br /&gt; // Check collections&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Ed ecco i risultati:&lt;/p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; border=&quot;1&quot; unselectable=&quot;on&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td &gt;&lt;strong&gt;Linq To Sql&lt;/strong&gt;&lt;/td&gt; &lt;td &gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt; &lt;td &gt;&lt;strong&gt;Nhibernate&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td &gt;0,31s&lt;/td&gt; &lt;td &gt;0,91s&lt;/td&gt; &lt;td &gt;0,65s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;L'&lt;em&gt;Entity Framework&lt;/em&gt; ne ha da strada da fare sul suo diretto e storico rivale...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ADO.NET_Entity_Framework/&quot; rel=&quot;tag&quot;&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ_to_SQL/&quot; rel=&quot;tag&quot;&gt;LINQ to SQL&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/NHibernate/&quot; rel=&quot;tag&quot;&gt;NHibernate&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term=".NET2"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx"/><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2404.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2404</trackback:ping></entry><entry><title>[OT] Questa mattina...</title><id>http://blogs.aspitalia.com/az/post2394/OT-Mattina.aspx</id><updated>2008-09-30T19:32:20+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2394' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Capita a volte di risvegliarsi senza sapere non solo in quale casa siamo, ma neanche la citt&#224; o paese! Tutto ci&#242; dura per pochi secondi, quindi ritornano alla mente i ricordi di cosa ci ha condotto l&#236; e tutto torna alla normalit&#224;. Al mio risveglio questo plumbeo paesaggio:&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;altrove&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/otquestamattina_120cf/immag038_3.jpg&quot; width=&quot;520&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt;Mi ha fatto tornare alla mente, anche se non ne capisco il collegamento, una novella di Poe:&lt;/p&gt; &lt;p&gt;&lt;em&gt;... Lo spettrale Pericolo cui ero &lt;br /&gt;soggetto mi perseguitava notte e giorno. Nella prima le torture della &lt;br /&gt;meditazione erano eccessive, nel secondo intollerabili. Quando le tetre &lt;br /&gt;Tenebre avviluppavano la Terra, io allora rabbrividivo al solo terrore di &lt;br /&gt;dover ancora pensare... rabbrividivo come rabbrividiscono sul carro &lt;br /&gt;funebre gli ondeggianti pennacchi. Allorche' la Natura non riusciva piu' &lt;br /&gt;a sopportare lo stato di veglia, era solo dopo uno sforzo violento che io &lt;br /&gt;cedevo al sonno, poiche' mi agghiacciava il timore di trovarmi al &lt;br /&gt;risveglio abitatore di una tomba. E allorche' infine cadevo in una specie &lt;br /&gt;di sonnolenza, cio' era solo per sentirmi trasportato immediatamente in &lt;br /&gt;un mondo di fantasmi, al disopra del quale si librava sovrana, unica, &lt;br /&gt;sepolcrale, l'Idea...&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term="Parole..."/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2394/OT-Mattina.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2394/OT-Mattina.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2394.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2394</trackback:ping></entry><entry><title>Triplet class non &amp;#232; un oggetto curioso, &amp;#232; utilissimo!!!</title><id>http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx</id><updated>2008-09-12T15:11:08+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2386' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Esiste dalla versione 1.0 del Framework. Lo ritendo &lt;strike&gt;l'oggetto pi&#249; curioso all'interno dello stesso &lt;/strike&gt;un oggetto utilissimo per l'uso del viewstate e la creazione dei custom control cos&#236; come spiegano nei commenti Cristian e Daniele.&lt;/p&gt; &lt;p&gt;Accetta tre parametri object. Esempio da &lt;a title=&quot;link esterno&quot; href=&quot;http://msdn.microsoft.com/it-it/library/system.web.ui.triplet.aspx&quot;&gt;MSDN&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Triplet circle = new Triplet(5, 7, 3); &lt;br /&gt;lblCircle.Text = &amp;quot;X position: &amp;quot; + circle.First + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;lt;br /&amp;gt;Y position: &amp;quot; + circle.Second + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;lt;br /&amp;gt;Radius: &amp;quot; + circle.Third; &lt;br /&gt; &lt;br /&gt;Triplet labels = new Triplet(Label1, Label2, Label3); &lt;br /&gt;Label1.Text = &amp;quot;Type: &amp;quot; + labels.First.GetType().ToString(); &lt;br /&gt;Label2.Text = &amp;quot;ToString: &amp;quot; + labels.Second.ToString(); &lt;br /&gt;Label3.Text = &amp;quot;HashCode: &amp;quot; + labels.Third.GetHashCode(); &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strike&gt;Sono basito.&lt;/strike&gt;&lt;/p&gt; &lt;p&gt;&lt;strike&gt;Essendo venerd&#236; un po' di leggerezza, no?&lt;/strike&gt;&lt;/p&gt; &lt;p&gt;Blog modificato per evitare il linciaggio! :)&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx"/><slash:comments>13</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2386/Triplet-Class-Oggetto-Curioso-Utilissimo.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2386.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2386</trackback:ping></entry><entry><title>Entity Framework e stranezze(*)</title><id>http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx</id><updated>2008-09-12T07:11:33+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2385' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;&lt;em&gt;Entity&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img height=&quot;200&quot; alt=&quot;entity&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/entityframeworkestranezze_8108/entity_3.gif&quot; width=&quot;394&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt;Codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;// Step 1 &lt;br /&gt;var coll2 = (from c in context.Men.Include(&amp;quot;Women&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c).First(); &lt;br /&gt;&lt;/em&gt;// &lt;br /&gt;// Visualizza item; &lt;br /&gt;//---------------------------------------------------------------- &lt;br /&gt;// &lt;br /&gt;// Step 2 &lt;br /&gt;// &lt;br /&gt;&lt;em&gt;coll2.Age++; &lt;br /&gt;coll2.Women.Age++; &lt;br /&gt;// &lt;br /&gt;// Visualizza item; &lt;br /&gt;//----------------------------------------------------------------- &lt;br /&gt;// &lt;br /&gt;// Step 3 &lt;br /&gt;// &lt;br /&gt;var coll3 = from c in context.Men.Include(&amp;quot;Women&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c; &lt;br /&gt;foreach (var item in coll3) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visualizza item; &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Nel primo caso come age della prima &lt;em&gt;entity&lt;/em&gt; e della seconda, viene visualizzato il contenuto iniziale della tabella (viene eseguita la query visibile grazie al profiler):&lt;/p&gt; &lt;p&gt;&lt;em&gt;1 e 1&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Al secondo step viene visualizzato:&lt;/p&gt; &lt;p&gt;&lt;em&gt;2 e 2&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Domanda finale... Che cosa viene visualizzato allo step 3? Do un aiuto, con il profiler &#232; visibile la query di select delle due &lt;em&gt;entity&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Dunque?&lt;/p&gt; &lt;p&gt;Qual &#232; la risposta?&lt;/p&gt; &lt;p&gt;Sto aspettando...&lt;/p&gt; &lt;p&gt;Be', si potrebbe pensare che visualizzi ancora 1 e 1 visto che esegue richiede le due tabella al database che ritornano i valori iniziali (proprio ci&#242; che avviene), ma invece viene visualizzato:&lt;/p&gt; &lt;p&gt;&lt;em&gt;2 e 2!!!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma perch&#233; esegue la query se alla finfine prende ancora i dati aggiornati in precedenza?&lt;/p&gt; &lt;p&gt;Un attimo di pensieri alterni...&lt;/p&gt; &lt;p&gt;Giungo alla conclusione che esegue queste query con controllare la consistenza dei dati, per vedere se eventualmente il record sul db &#232; stato modificato da qualcosa d'altro. Anzi, oso di pi&#249;, mi convinco che sia questo il motivo.&lt;/p&gt; &lt;p&gt;Avvio il profiler e l'enterprise manager.&lt;/p&gt; &lt;p&gt;Eseguo i due step, blocco, modifico il record esternamente, e eseguo l'ultimo passo. La query viene eseguita e presi i dati... ma non accade nulla!!! Nulla di nulla!&lt;/p&gt; &lt;p&gt;Non mi arrendo. Modifico le propriet&#224; delle due &lt;em&gt;entity&lt;/em&gt;. Imposto &lt;em&gt;Age&lt;/em&gt; come &lt;em&gt;Concurrency Mode&lt;/em&gt; a &lt;em&gt;Fixed&lt;/em&gt;. Riprovo. Non cambia nulla... uff... Per avere aggiornati i dati dobbiamo &lt;em&gt;forzare&lt;/em&gt; la cosa:&lt;/p&gt; &lt;p&gt;&lt;em&gt;// &lt;br /&gt;// Step 3 &lt;br /&gt;// &lt;br /&gt;var coll3 = from c in context.Men.Include(&amp;quot;Women&amp;quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c; &lt;br /&gt;foreach (var item in coll3) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Refresh(System.Data.Objects.RefreshMode.StoreWins, item.Women); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Visualizzo dati &lt;br /&gt;}&lt;/em&gt; &lt;/p&gt; &lt;p&gt;Buono a sapersi, ma perch&#233; la query non la fa in questo caso e solo questo?&lt;/p&gt; &lt;p&gt;(*) La parola &lt;em&gt;strano&lt;/em&gt;, che vuol d&#236;? Qualcosa che non &#232; normale, qualcosa al di fuori di ogni schema? Ma in s&#233;, che significa? E' una prola senza significato. Cos'&#232; &lt;em&gt;strano&lt;/em&gt;? Ci&#242; che fuori dal normale senso civico e comportamentale? Chi ha creato l'&lt;em&gt;Entity Framework &lt;/em&gt;sapr&#224; dirmi il perch&#233; di questo comportamento che riterr&#224; normale... dunque &#232; strano ci&#242; che penso io! &lt;em&gt;Strano&lt;/em&gt; &#232; una parola inutile, da cancellare. Che parola odiosa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ADO.NET_Entity_Framework/&quot; rel=&quot;tag&quot;&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx"/><slash:comments>6</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2385/Entity-Framework-Stranezze.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2385.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2385</trackback:ping></entry><entry><title>Entity Framework. Una tabella due Entity senza discriminazioni</title><id>http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx</id><updated>2008-09-06T08:52:04+00:00</updated><content type="text/html">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2383' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In un &lt;a href=&quot;http://blogs.aspitalia.com/az/post2377/entity-framework-ereditarieta-single-table-inheritance.aspx&quot;&gt;blog precedente&lt;/a&gt; avevo parlato del &lt;em&gt;Single Table Inheritance&lt;/em&gt;. Grazie ad un campo apposito &#232; possibile decidere a quale &lt;em&gt;entity&lt;/em&gt; far&#224; parte il record di quella nostra tabella.&lt;/p&gt; &lt;p&gt;Il problema che sto cercando di risolvere in questi giorni si basa sul quesito:&lt;/p&gt; &lt;p&gt;&lt;em&gt;E' possibile dividere una tabella in due entity &lt;strong&gt;senza&lt;/strong&gt; questo campo?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma prima che subentri la confusione, il mio obbiettivo non &#232; quello di creare due &lt;em&gt;entity&lt;/em&gt; parallele come nel caso di quel blog (&lt;em&gt;TextContents&lt;/em&gt; e &lt;em&gt;LinkContents&lt;/em&gt;), ma una &lt;em&gt;entity&lt;/em&gt; di base da cui deriva un'altra &lt;em&gt;entity&lt;/em&gt;. Per esempio, da questa tabella:&lt;/p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; border=&quot;1&quot; unselectable=&quot;on&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width=&quot;200&quot;&gt;&lt;strong&gt;&lt;em&gt;Nome campo&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td  width=&quot;200&quot;&gt;&lt;strong&gt;&lt;em&gt;Tipo&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width=&quot;200&quot;&gt;&lt;em&gt;Id&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;200&quot;&gt;&lt;em&gt;int&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width=&quot;200&quot;&gt;&lt;em&gt;Title&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;200&quot;&gt;&lt;em&gt;nvarchar(50)&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width=&quot;200&quot;&gt;&lt;em&gt;LongDescriptions&lt;/em&gt;&lt;/td&gt; &lt;td  width=&quot;200&quot;&gt;&lt;em&gt;ntext&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Vorrei ottenere una struttura come questa (poi spiegher&#242; il perch&#233;):&lt;/p&gt; &lt;p&gt;&lt;img height=&quot;300&quot; alt=&quot;nuove entity&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/ent.unatabelladueentitysenzadiscriminazi_8fd2/image_1.png&quot; width=&quot;180&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt;Il problema che mi ero posto &#232; molto semplice: in caso volessi visualizzare tutti i record della tabella in un menu di scelta, la richiesta dei dati presenti in un'unica &lt;em&gt;entity&lt;/em&gt; avrebbe richiesto tutti i campi anche quelli &lt;em&gt;ntext&lt;/em&gt; (che potrebbero contenere, per assurdo, mega di documenti di testo), come si pu&#242; evitare questo?&lt;/p&gt; &lt;p&gt;Ah, dimenticavo, visto che questi dati devono attraversare dei layer dell'applicativo, non voglio usare gli anonynous type, altrimenti sarebbe troppo facile scrivere:&lt;/p&gt; &lt;p&gt;&lt;em&gt;var coll=from d in Context.Documents&lt;br /&gt; select new { Id=d.Id, Title=d.Title };&lt;br /&gt;return coll;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Anche se questa soluzione porta l'&lt;em&gt;Entity Framework&lt;/em&gt; a inviare la giusta query al database:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;1 AS [C1], &lt;br /&gt;[Extent1].[Id] AS [Id], &lt;br /&gt;[Extent1].[Title] AS [Title]&lt;br /&gt;FROM [dbo].[Descriptions] AS [Extent1]&lt;/em&gt; &lt;p&gt;Una soluzione che mi hanno suggerito &#232; creare una classe che ospiti solo quei dati: &lt;p&gt;&lt;em&gt;public class Elenco&lt;br /&gt;{&lt;br /&gt; public int Id { get; set; }&lt;br /&gt; public string Title { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var coll = from c in context.Descriptions&lt;br /&gt; select new Elenco { Id = c.Id, Title = c.Title };&lt;br /&gt;foreach (var item in coll)&lt;br /&gt;{&lt;br /&gt; Response.Write(string.Format(&lt;br /&gt; &quot;{0} {1} &amp;lt;br /&amp;gt;&quot;,&lt;br /&gt; item.Id,&lt;br /&gt; item.Title&lt;br /&gt; ));&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Pu&#242; andare. Si potrebbe trovare un'altra soluzione con l'uso delle viste. Creata questa vista: &lt;p&gt;&lt;em&gt;select Id,Title from Descriptions&lt;/em&gt; &lt;p&gt;Si possono creare due &lt;em&gt;entity&lt;/em&gt; distinte all'interno dell'editor di &lt;em&gt;Visual Studio 2008&lt;/em&gt;: &lt;p&gt;&lt;img height=&quot;322&quot; alt=&quot;due entity con tabella e vista&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/ent.unatabelladueentitysenzadiscriminazi_8fd2/image_3.png&quot; width=&quot;190&quot; border=&quot;0&quot; /&gt; &lt;p&gt;Lo schifo &#232; che sono due &lt;em&gt;entity&lt;/em&gt; distinte, ma risolvono in parte il problema. Segnalo che, importata questa vista nell'editor, i campi vengono visti entrambi come &lt;em&gt;key&lt;/em&gt;. Non &#232; sufficiente modificare le propriet&#224; nell'editor, &#232; necessario aprire il file .edmx con un editor xml e cancellare la doppia key: &lt;p&gt;&lt;em&gt;&amp;lt;EntityType Name=&quot;DescriptionsTitles&quot;&amp;gt;&lt;br /&gt; &amp;lt;Key&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name=&quot;Id&quot; /&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name=&quot;Title&quot; /&amp;gt;&lt;strong&gt; &amp;lt;-- Da cancellare&lt;br /&gt;&lt;/strong&gt; &amp;lt;/Key&amp;gt;&lt;br /&gt; &amp;lt;Property Name=&quot;Id&quot; Type=&quot;int&quot; Nullable=&quot;false&quot; StoreGeneratedPattern=&quot;Identity&quot; /&amp;gt;&lt;br /&gt; &amp;lt;Property Name=&quot;Title&quot; Type=&quot;nvarchar&quot; Nullable=&quot;false&quot; MaxLength=&quot;50&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/EntityType&amp;gt;&lt;br /&gt;&amp;lt;EntityType Name=&quot;DescriptionsTitles&quot;&amp;gt;&lt;br /&gt; &amp;lt;Key&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name=&quot;Id&quot; /&amp;gt;&lt;br /&gt; &amp;lt;PropertyRef Name=&quot;Title&quot; /&amp;gt; &lt;strong&gt;&amp;lt;-- Da cancellare&lt;br /&gt;&lt;/strong&gt; &amp;lt;/Key&amp;gt;&lt;br /&gt; &amp;lt;Property Name=&quot;Id&quot; Type=&quot;Int32&quot; Nullable=&quot;false&quot; /&amp;gt;&lt;br /&gt; &amp;lt;Property Name=&quot;Title&quot; Type=&quot;String&quot; Nullable=&quot;false&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/EntityType&amp;gt;&lt;/em&gt; &lt;p&gt;Poco sopra nell'xml &#232; possibile vedere com'&#232; importata la vista:&lt;/p&gt; &lt;p&gt;&lt;em&gt; &amp;lt;EntitySet Name=&quot;DescriptionsTitles&quot; EntityType=&quot;TestEntitiesModel.Store.DescriptionsTitles&quot; store:Type=&quot;Views&quot; store:Schema=&quot;dbo&quot; store:Name=&quot;DescriptionsTitles&quot;&amp;gt;&lt;br /&gt; &amp;lt;DefiningQuery&amp;gt;SELECT &lt;br /&gt;[DescriptionsTitles].[Id] AS [Id], &lt;br /&gt;[DescriptionsTitles].[Title] AS [Title]&lt;br /&gt;FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]&lt;br /&gt; &amp;lt;/DefiningQuery&amp;gt;&lt;br /&gt; &amp;lt;/EntitySet&amp;gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questo comporta, alla richiesta dei dati, l'esecuzione di questa query:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;[Extent1].[Id] AS [Id], &lt;br /&gt;[Extent1].[Title] AS [Title]&lt;br /&gt;FROM (SELECT &lt;br /&gt; [DescriptionsTitles].[Id] AS [Id], &lt;br /&gt; [DescriptionsTitles].[Title] AS [Title]&lt;br /&gt; FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]) AS [Extent1]&lt;/em&gt; &lt;p&gt;Alla fine c'&#232; la soluzione compatibile con l'&lt;em&gt;Entity Framework&lt;/em&gt; e la mia necessit&#224;. Ma si deve mettere mano alla struttura del database. Si deve dividere quella tabella in due, spostando il campo &lt;em&gt;LongDescriptions&lt;/em&gt; nella seconda naturalmente collegando il tutto. L'EF non far&#224; una piega e vedr&#224; il tutto in modo corretto e otterrei ci&#242; che voglio. &lt;p&gt; &lt;p&gt;&lt;em&gt;Posso avere tutto ci&#242; che voglio? No, non &#232; possibile.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ADO.NET_Entity_Framework/&quot; rel=&quot;tag&quot;&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/LINQ/&quot; rel=&quot;tag&quot;&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><author><name>Andrea Zani</name></author><category term=".NET"/><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx"/><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2383/Entity-Framework.-Tabella-Entity-Discriminazioni.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2383.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2383</trackback:ping></entry></feed>