LINQ http://blogs.ugidotnet.org/rgm/category/LINQ.aspx LINQ it-IT Gian Maria Ricci Subtext Version 2.6.0.0 Lambda expression ed expression Tree http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91152.aspx <p>Nel <a href="http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91147.aspx">precedente post</a> ho mostrato come le lambda expression non sono assolutamente la stessa cosa che un delegate anonimo, la ragione è che il compilatore può tradurre una lambda expression in due modi molto differenti, il primo è semplice codice IL, proprio come un delegate anonimo, mentre il secondo è un Expression Tree. La IQueryable, che è l'interfaccia utilizzata da LINQ to SQL, accetta quindi nel where due cose distinte, un delegate di tipo Func&lt;T, Boolean&gt; oppure un Expression&lt;Func&lt;T, Boolean&gt;&gt;, il compilatore se presente preferisce sempre compilare con una Expression, ecco perchè LINQ2SQL è in grado di tradurre lo StartsWith() con un LIKE.</p> <p>La conferma come sempre è nell'IL generato.</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/LambdaexpressionedexpressionTree_105DE/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="271" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/LambdaexpressionedexpressionTree_105DE/image_thumb.png" width="952" border="0" /></a> </p> <p> </p> <p>Senza andare in dettaglio dalla lambda come potete vedere viene generata una Expression, differente è il caso del delegate</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/LambdaexpressionedexpressionTree_105DE/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="170" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/rgm/WindowsLiveWriter/LambdaexpressionedexpressionTree_105DE/image_thumb_1.png" width="793" border="0" /></a> </p> <p>MEntre un delegate è un insieme di istruzioni IL da cui LINQ2SQL non può capire nulla, un expression tree è un oggetto complesso che al suo interno contiene tutte le informazioni sull'espressione e quindi permette a LINQ2SQL di capire cosa fare.</p> <p>alk.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c31a10cb-9548-43e9-b064-aa00ac8308e9" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/Linq%20to%20SQL" rel="tag">Linq to SQL</a>,<a href="http://technorati.com/tags/Expression%20Tree" rel="tag">Expression Tree</a></div><img src="http://blogs.ugidotnet.org/rgm/aggbug/91152.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91152.aspx Tue, 12 Feb 2008 19:40:39 GMT http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91152.aspx#feedback http://blogs.ugidotnet.org/rgm/comments/commentRss/91152.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/91152.aspx Lambda expression sono solo syntactic Sugar? http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91147.aspx <p>Se qualcuno fosse convinto che le lambda expression sono solamente Syntactic Sugar per esprimere delegate anonimi potrà essere piacevolmente sorpreso da questo esempio in LINQ to SQL.</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e904587d-3d46-4107-9021-9acc73e45df6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">FirstTestDataContext context </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> FirstTestDataContext(); context.Log </span><span style="color: #000000;">=</span><span style="color: #000000;"> Console.Out; IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Customer</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> custs </span><span style="color: #000000;">=</span><span style="color: #000000;"> context.Customers .Where(C </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> C.CustomerID.StartsWith(</span><span style="color: #800000;">"</span><span style="color: #800000;">A</span><span style="color: #800000;">"</span><span style="color: #000000;">)); Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">Recuperati {0} oggetti Customer</span><span style="color: #800000;">"</span><span style="color: #000000;">, custs.Count()); custs </span><span style="color: #000000;">=</span><span style="color: #000000;"> context.Customers .Where(</span><span style="color: #0000FF;">delegate</span><span style="color: #000000;">(Customer C) { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> C.CustomerID.StartsWith(</span><span style="color: #800000;">"</span><span style="color: #800000;">A</span><span style="color: #800000;">"</span><span style="color: #000000;">); }); Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">Recuperati {0} oggetti Customer</span><span style="color: #800000;">"</span><span style="color: #000000;">, custs.Count());</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p> </p> <p>In sostanza la prima query usa una lambda expression del tipo C =&gt; C.CustomerID.StartsWith("A") e la seconda usa invece un delegate anonimo ma il codice è lo stesso. Osserviamo le query che vengono eseguite.</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c038fb35-f1e8-4be5-afb1-942897e43455" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">CustomerID</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">CompanyName</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">ContactName</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Contact itle</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Address</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">City</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Region</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">PostalCode</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Cou try</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Phone</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Fax</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Customers</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">WHERE</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">CustomerID</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #808080;">LIKE</span><span style="color: #000000;"> </span><span style="color: #008000;">@p0</span><span style="color: #000000;"> </span><span style="color: #008080;">--</span><span style="color: #008080;"> @p0: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [A%]</span><span style="color: #008080;"> --</span><span style="color: #008080;"> Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8</span><span style="color: #008080;"> </span><span style="color: #000000;"> Recuperati </span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;"> oggetti Customer </span><span style="color: #0000FF;">SELECT</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">CustomerID</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">CompanyName</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">ContactName</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Contact itle</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Address</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">City</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Region</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">PostalCode</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Cou try</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Phone</span><span style="color: #FF0000;">]</span><span style="color: #000000;">, </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Fax</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">FROM</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">dbo</span><span style="color: #FF0000;">]</span><span style="color: #000000;">.</span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">Customers</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #0000FF;">AS</span><span style="color: #000000;"> </span><span style="color: #FF0000;">[</span><span style="color: #FF0000;">t0</span><span style="color: #FF0000;">]</span><span style="color: #000000;"> </span><span style="color: #008080;">--</span><span style="color: #008080;"> Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Come si può facilmente vedere la prima query che fa uso di lambda expression è molto efficiente perchè effettua direttamente una query con l'operatore LIKE, mentre la seconda recupera tutti gli oggetti customer dal database e poi li filtra con il delegate anonimo che è stato definito.</p> <p>Lascio a voi il capire il perchè ;), ma questo basti per far capire che una lambda expression è qualcosa di più che "Syntactic Sugar".</p> <p>Alk.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1256abab-9b46-457b-82af-8cc1a8366c5d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/Lambda%20expression" rel="tag">Lambda expression</a>,<a href="http://technorati.com/tags/LINQ%20to%20SQL" rel="tag">LINQ to SQL</a></div><img src="http://blogs.ugidotnet.org/rgm/aggbug/91147.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91147.aspx Tue, 12 Feb 2008 14:44:47 GMT http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91147.aspx#feedback 3 http://blogs.ugidotnet.org/rgm/comments/commentRss/91147.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/91147.aspx Linq to Sql: Usare mapping file invece di attributi http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91139.aspx <p>Utilizzando il designer le vostre classi di accesso ai dati conterranno una serie di attributi necessari affinche Linq to Sql possa gestire le operazioni di persistenza dei dati.</p> <p>Se non amate gli attributi e preferite invece file di mapping xml la soluzione è utilizzare l'utility SqlMetal.exe fornita con visual studio, che vi permette di generare tutte le classi per un intero database. Ecco ad esempio come generare tutto il dominio per il database NorthWind</p> <p><em>sqlmetal /server:LAPTOPVM1SQLEXPRESS /database:northwind /map:NorthwindVer1.map /code:NorthwindVer1.cs</em> </p><p>La sintassi è veramente facile, basta infatti specificare il nome del server, il database ed i nomi dei file da generare, uno (il punto map) contiene il mapping, mentre l'altro contiene il codice di tutte le classi. A questo punto basta includere il file .cs nella propria solution ed il gioco e chiamare il costruttore del DataContext passando manualmente il MappingSource </p><p></p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:87b2316b-2ace-49a8-b653-8d2c8cdf5350" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #000000;">Northwind database </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Northwind( </span><span style="color: #800000;">"</span><span style="color: #800000;">server=LAPTOPVM1\\SQLEXPRESS;Database=Northwind;Integrated Security=SSPI</span><span style="color: #800000;">"</span><span style="color: #000000;">, XmlMappingSource.FromUrl( </span><span style="color: #800000;">"</span><span style="color: #800000;">NorthwindVer1.map</span><span style="color: #800000;">"</span><span style="color: #000000;">));</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p></p> <p> </p> <p>La classe <em>XmlMappingSource</em> del namespace <em>System.Linq.Data.Mapping </em>permette infatti di generare l'oggetto MappingSource dal file di mapping, mentre nel DataContext generato con il designer si trova questa riga</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:dc680dee-cae8-4d99-8f7c-cd39e4ddad8a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> System.Data.Linq.Mapping.MappingSource mappingSource </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> AttributeMappingSource();</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p> </p> <p>che mostra chiaramente come in questo caso il MappingSource venga generato dagli attributi delle classi. Se si controllano le classi generate dal SQLMetal con l'opzione map attiva si nota che non sono più presenti gli attributi per il mapping.</p> <p>Quale delle due soluzioni adottare è questione di gusto personale, ma per chi come me viene da NHibernate avere il file di mapping può essere interessante.</p> <p>alk.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:59537322-32f2-40d2-aa23-cf93b7691447" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/Linq%20to%20Sql" rel="tag">Linq to Sql</a>,<a href="http://technorati.com/tags/MappingSource" rel="tag">MappingSource</a></div><img src="http://blogs.ugidotnet.org/rgm/aggbug/91139.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91139.aspx Tue, 12 Feb 2008 10:13:31 GMT http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91139.aspx#feedback http://blogs.ugidotnet.org/rgm/comments/commentRss/91139.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/91139.aspx LINQ, le prime impressioni http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91137.aspx <p>Dopo avere giocato con Linq to entities e linq to xml (che trovo veramente comodo) ho iniziato a giocare con LINQ to SQL. Debbo dire che le prime impressioni sono decisamente buone, il prodotto è sicuramente molto valido e vale la pena guardarlo.</p> <p>La prima considerazione che mi è venuta guardando le classi generate è la trasparenza rispetto all'ORM, utilizzando le oramai straconosciute Customers e Orders del database Northwind, si nota infatti che la relazione è fatta utilizzando due classi speciali la EntityRef&lt;T&gt; e la EntitySet&lt;T&gt;. Queste due classi sono automaticamente utilizzate dal designer per gestire i riferimenti, mentre NHibernate ad esempio mappa normalmente i riferimenti e anche property o field di tipo IList. </p> <p>D'altra parte LINQ to SQL non vuole essere un ORM a 360°, anche perchè supporta solamente SQL Server, per cui queste piccole intromissioni di classi proprietarie nel dominio non danno sicuramente fastidio.</p> <p>alk.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cb364e1a-95ad-4b04-a61c-dbda66db1235" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/LINQ%20to%20Sql" rel="tag">LINQ to Sql</a>,<a href="http://technorati.com/tags/Persistence%20Ignorance" rel="tag">Persistence Ignorance</a></div><img src="http://blogs.ugidotnet.org/rgm/aggbug/91137.aspx" width="1" height="1" /> Gian Maria Ricci http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91137.aspx Tue, 12 Feb 2008 09:16:14 GMT http://blogs.ugidotnet.org/rgm/archive/2008/02/12/91137.aspx#feedback http://blogs.ugidotnet.org/rgm/comments/commentRss/91137.aspx http://blogs.ugidotnet.org/rgm/services/trackbacks/91137.aspx