LINQ http://blogs.ugidotnet.org/PietroLibroBlog/category/LINQ.aspx LINQ it-IT Pietro Libro pietro.libro@libero.it Subtext Version 2.6.0.0 Documentazione EF 7 (Beta 5) http://blogs.ugidotnet.org/PietroLibroBlog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx Documentazione "Work in Progress" della prossima release di Entity Framework : <a href="http://ef.readthedocs.org/en/latest/" target="_blank">http://ef.readthedocs.org/en/latest/</a><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/102030.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx Wed, 22 Jul 2015 09:07:28 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/102030.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/102030.aspx EF 6.1 : What&rsquo;s new (3) http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx <p>Supporto a “.ToString()” e “String.Concat()”, un esempio:</p> <pre class="csharpcode">var queryConcat = from c <span class="kwrd">in</span> db.Vehicles <span class="kwrd">where</span> <span class="kwrd">string</span>.Concat(c.EngineSize, c.HP).Equals(<span class="str">"1600110"</span>) select c; var queryToString = from c <span class="kwrd">in</span> db.Vehicles <span class="kwrd">where</span> c.HP.ToString().Equals(<span class="str">"110"</span>) select c;</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Abbiamo due Query LINQ che filtrano i dati in base a condizioni su stringhe, la prima “tira fuori” tutti i veicoli dove la concatenazione dei valori delle proprietà “EngineSize” e “HP” è uguale a “1600110”, mentre la seconda esegue un filtro su di un valore intero convertio in stringa. Se proviamo ad eseguire il codice in un ambiente con EF 6.0 otteniamo un’eccezione a runtime in tutti e due i casi:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_thumb.png" width="244" height="223" /></a></p> <p>Con EF 6.1 le query sono eseguite correttamente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_thumb_1.png" width="244" height="165" /></a></p> <p>Cosa succede dietro le quinte:</p> <pre class="csharpcode"><span class="kwrd">SELECT</span> [GroupBy1].[A1] <span class="kwrd">AS</span> [C1] <span class="kwrd">FROM</span> ( <span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(1) <span class="kwrd">AS</span> [A1] <span class="kwrd">FROM</span> [DomusDotNet].[Vehicles] <span class="kwrd">AS</span> [Extent1] <span class="kwrd">WHERE</span> N<span class="str">'1600110'</span> = (<span class="kwrd">CASE</span> <span class="kwrd">WHEN</span> ([Extent1].[EngineSize] <span class="kwrd">IS</span> <span class="kwrd">NULL</span>) <span class="kwrd">THEN</span> N<span class="str">''</span> <span class="kwrd">ELSE</span> [Extent1].[EngineSize] <span class="kwrd">END</span> + <span class="kwrd">CAST</span>( [Extent1].[HP] <span class="kwrd">AS</span> nvarchar(<span class="kwrd">max</span>))) ) <span class="kwrd">AS</span> [GroupBy1] <span class="kwrd">SELECT</span> [GroupBy1].[A1] <span class="kwrd">AS</span> [C1] <span class="kwrd">FROM</span> ( <span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(1) <span class="kwrd">AS</span> [A1] <span class="kwrd">FROM</span> [DomusDotNet].[Vehicles] <span class="kwrd">AS</span> [Extent1] <span class="kwrd">WHERE</span> N<span class="str">'110'</span> = <span class="kwrd">CAST</span>( [Extent1].[HP] <span class="kwrd">AS</span> nvarchar(<span class="kwrd">max</span>)) ) <span class="kwrd">AS</span> [GroupBy1]</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Da analizzare il funzionamento di “String.Concat(…)” con SQL Server 2012 per verificare la conversione in SQL con la funzione “nativa SQL” “<a href="http://technet.microsoft.com/en-us/library/hh231515.aspx" target="_blank">Concat</a>”.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101829.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx Thu, 27 Mar 2014 10:04:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101829.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101829.aspx EF : Relazione one-to-many Table-View http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/12/19/ef-relazione-one-to-many-table-view.aspx <p>Immaginiamo di avere un database SQL Server esistente, e vogliamo utilizzare Entity Framework Code First per mappare il modello dati. </p> <p>Supponendo di avere due tabelle “Items” e “Categories” in relazione come da <em>Database Diagram</em> seguente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/a8bf8935c20d_D16A/image_2.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/a8bf8935c20d_D16A/image_thumb.png" width="244" height="94" /></a></p> <p>Ed una “Vista” SQL Server definita come segue:</p> <pre class="csharpcode"><span class="kwrd">CREATE</span> <span class="kwrd">VIEW</span> [dbo].[VCategories] <span class="kwrd">AS</span> <span class="kwrd">SELECT</span> Id, Name <span class="kwrd">FROM</span> Categories <span class="kwrd">WHERE</span> (Deleted = 0)</pre> <pre class="csharpcode"> </pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Aggiungiamo due classi C# definite in questo modo:</p> <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> Category { <span class="kwrd">public</span> <span class="kwrd">int</span> Id { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> Description { get; set; } }</pre> <p> </p> <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> Item { <span class="kwrd">public</span> <span class="kwrd">int</span> Id { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> Code { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> Description { get; set; } <span class="kwrd">public</span> <span class="kwrd">int</span> CategoryId { get; set; } <span class="kwrd">public</span> Category Category { get; set; } }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>che mappiamo tramite <em>OnModelCreating (</em>nella classe derivata da <em>DbContext) </em>come segue :</p> <pre class="csharpcode"><span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity&lt;Category&gt;().ToTable(<span class="str">"VCategories"</span>) .Property(c =&gt; c.Description).HasColumnName(<span class="str">"Name"</span>); modelBuilder.Entity&lt;Item&gt;().ToTable(<span class="str">"Items"</span>); modelBuilder.Entity&lt;Item&gt;().HasRequired(x =&gt; x.Category) .WithMany().HasForeignKey(o =&gt; o.CategoryId); }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Per verificare il funzionamento del <em>mapping</em> possiamo scrivere del codice tipo:</p> <pre class="csharpcode">Item item = <span class="kwrd">null</span>; <span class="kwrd">using</span> (Db db = <span class="kwrd">new</span> Db()) { Console.WriteLine(<span class="str">"Items count : {0}"</span>, db.Items.Count()); Category category = (from c <span class="kwrd">in</span> db.Categories <span class="kwrd">where</span> c.Id == 1 select c) .FirstOrDefault(); item = <span class="kwrd">new</span> Item() { Category = category, CategoryId = category.Id, Code = <span class="str">"Code #1"</span>, Description = <span class="str">"Description #1"</span>, }; db.Items.Add(item); db.SaveChanges(); Console.WriteLine(<span class="str">"Items count : {0}"</span>, db.Items.Count()); } <span class="kwrd">using</span> (Db db = <span class="kwrd">new</span> Db()) { <span class="rem">////Edit</span> item.Description = <span class="str">"New Description #1."</span>; db.Entry&lt;Item&gt;(item).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); Console.WriteLine(<span class="str">"Items count : {0}"</span>, db.Items.Count()); } <span class="kwrd">using</span> (Db db = <span class="kwrd">new</span> Db()) { <span class="rem">////Delete. </span> db.Entry&lt;Item&gt;(item).State = System.Data.Entity.EntityState.Deleted; db.SaveChanges(); Console.WriteLine(<span class="str">"Items count : {0}"</span>, db.Items.Count()); }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101747.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/12/19/ef-relazione-one-to-many-table-view.aspx Thu, 19 Dec 2013 16:55:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/12/19/ef-relazione-one-to-many-table-view.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101747.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101747.aspx DomusDotNet : We Want Web, grazie a tutti :-) http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/03/10/domusdotnet-wewantweb-grazie-a-tutti.aspx <p>Ieri 9/3/12 si è svolto l’evento WeWantWeb organizzato da DomusDotNet presso la sede Microsoft di Roma. Le sessioni sono state registrare e quanto prima pubblicheremo Slide, codice sorgente degli esempi e Video, sul sito di <a href="http://www.domusdotnet.org/" target="_blank">DomusDotNet</a>. Grazie a tutti i partecipanti!!! Attendiamo i vostri feedback! Al prossimo evento <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/wlEmoticon-smile_2.png" />.</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000309_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Alessandro Mostarda e Massibo Bonanni" border="0" alt="Alessandro Mostarda e Massibo Bonanni" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000309_thumb.jpg" width="184" height="244" /></a><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000311_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Giorgio Di Nardo" border="0" alt="Giorgio Di Nardo" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000311_thumb.jpg" width="184" height="244" /></a><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000317_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Nicolò Carandini" border="0" alt="Nicolò Carandini" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000317_thumb.jpg" width="184" height="244" /></a><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000333_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Pietro Libro" border="0" alt="Pietro Libro" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000333_thumb.jpg" width="184" height="244" /></a><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000307_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WP_000307" border="0" alt="WP_000307" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/WP_000307_thumb.jpg" width="184" height="244" /></a></p> <p>Da sinistra verso destra: <a href="http://www.alessandromostarda.com/" target="_blank">Alessandro Mostarda</a> e <a href="http://codetailor.blogspot.com/" target="_blank">Massimo Bonanni</a>, Giorgio Di Nardo, <a href="http://blogs.ugidotnet.org/Nick60/Default.aspx" target="_blank">Nick</a>, io <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/wlEmoticon-smile_2.png" />, parte di coloro che hanno avuto la pazienza di ascoltarci <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/7226c6221ecf_11545/wlEmoticon-smile_2.png" />.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100854.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/03/10/domusdotnet-wewantweb-grazie-a-tutti.aspx Sat, 10 Mar 2012 20:52:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/03/10/domusdotnet-wewantweb-grazie-a-tutti.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100854.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100854.aspx .NET e soddisfazioni http://blogs.ugidotnet.org/PietroLibroBlog/archive/2010/08/29/.net-e-soddisfazioni.aspx <p>Dopo tanti sacrifici, ogni tanto arriva qualche soddisfazione: ieri è mi giunta  una copia del libro “Approaches in Material Sampling”, in cui, oltre ad essere uno dei coautori di un capitolo (Grazie Gianni), è presente un CD allegato con alcuni software che permettono di eseguire analisi statistiche sui dati di campionamento. Uno di questi è SISSI 2.0: “a resampling-based software for sample size determination”. Il tool è stato scritto in .NET 3.5 facendo largo uso di LINQ To Objects e programmazione multi-threading. Spero quanto prima di riuscire ad eseguire il <em>porting</em> verso .NET 4.0 per sfruttare MEF ed aggiungere un paio di funzionalità statistiche non presenti nella versione allegata al libro.</p> <p><a title="Approaches in Material Sampling" href="http://www.iospress.nl/html/9781607505525.php"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.iospress.nl/covers_b/9781607505525.jpg" /></a></p> <p>Maggiori dettagli sul testo sono presenti a questo indirizzo: <a title="http://www.iospress.nl/loadtop/load.php?isbn=9781607505525" href="http://www.iospress.nl/loadtop/load.php?isbn=9781607505525" target="_blank">http://www.iospress.nl/loadtop/load.php?isbn=9781607505525</a> mentre una versione aggiornata del software è allegata al post.</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:FF7EC618-8FBE-49a5-B908-2339AF2ABCDF:ed08956d-f2c2-4d5b-945a-8cbad4637669" class="wlWriterEditableSmartContent"><div>Download File - <a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/0e7d0cc204d1.NETesoddisfazioni_103EF/tmpC7CA.zip" target="_self">SISSI 2.0.114</a></div></div><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/99123.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2010/08/29/.net-e-soddisfazioni.aspx Sun, 29 Aug 2010 19:28:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2010/08/29/.net-e-soddisfazioni.aspx#feedback 8 http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/99123.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/99123.aspx Estrazione di indici da una lista con LINQ http://blogs.ugidotnet.org/PietroLibroBlog/archive/2009/11/27/estrazione-di-indici-da-una-lista-con-linq.aspx <p>Se abbiamo una lista, ad esempio contenenti dei nomi, e vogliamo estrarre gli indici delle item che soddisfano una certa condizione di filtro, possiamo scrivere: </p> <style type="text/css"><![CDATA[ .code0 { font-size: small; font-family: consolas, "Courier New", courier, monospace; color: #000000; background-color: #ffffff; } .code1 { margin: 0em; } .code2 { margin: 0em; width: 100%; background-color: #f0f0f0; } .code3 { color: #808080; background-color: #ffffff; } .code4 { color: #0000ff; } .code5 { color: #000000; } .code6 { color: #6f002f; }]]></style> <div class="code0"> <pre class="code1"><span class="code3"> 1: </span><span class="code4">Dim </span><span class="code5">Nomi </span><span class="code4">As New </span><span class="code5">List(</span><span class="code4">Of </span><span class="code6">String</span><span class="code5">)</span></pre> <pre class="code2"><span class="code3"> 2: </span> </pre> <pre class="code1"><span class="code3"> 3: </span><span class="code5">Nomi.Add("Antonio")</span></pre> <pre class="code2"><span class="code3"> 4: </span><span class="code5">Nomi.Add("Franco")</span></pre> <pre class="code1"><span class="code3"> 5: </span><span class="code5">Nomi.Add("Giovanni")</span></pre> <pre class="code2"><span class="code3"> 6: </span><span class="code5">Nomi.Add("Antonio")</span></pre> <pre class="code1"><span class="code3"> 7: </span> </pre> <pre class="code2"><span class="code3"> 8: </span><span class="code4">Dim </span><span class="code5">sStringaRiferimento </span><span class="code4">As </span><span class="code6">String </span><span class="code5">= "Antonio"</span></pre> <pre class="code1"><span class="code3"> 9: </span> </pre> <pre class="code2"><span class="code3">10: </span><span class="code4">Dim </span><span class="code5">q </span><span class="code4">As </span><span class="code5">IEnumerable(</span><span class="code4">Of </span><span class="code6">Integer</span><span class="code5">) = Nomi.</span><span class="code4">Select</span><span class="code5">( _</span></pre> <pre class="code1"><span class="code3">11: </span> <span class="code4">Function</span><span class="code5">(nome, indice) </span><span class="code4">New With </span><span class="code5">{nome, indice}) _</span></pre> <pre class="code2"><span class="code3">12: </span> <span class="code5">.Where(</span><span class="code4">Function</span><span class="code5">(item) item.nome.Equals(sStringaRiferimento)) _</span></pre> <pre class="code1"><span class="code3">13: </span> <span class="code5">.</span><span class="code4">Select</span><span class="code5">(</span><span class="code4">Function</span><span class="code5">(item) item.indice)</span></pre> </div> <p>O meglio:</p> <style type="text/css"><![CDATA[ .code0 { font-size: small; font-family: consolas, "Courier New", courier, monospace; color: #000000; background-color: #ffffff; } .code1 { margin: 0em; } .code2 { margin: 0em; width: 100%; background-color: #f0f0f0; } .code3 { color: #808080; background-color: #ffffff; } .code4 { color: #0000ff; } .code5 { color: #000000; }]]></style> <div class="code0"> <pre class="code1"><span class="code3">1: </span><span class="code4">Dim </span><span class="code5">q1 = Nomi.</span><span class="code4">Select</span><span class="code5">(</span><span class="code4">Function</span><span class="code5">(v, i) RicercaNome(v, "Antonio", i)).Where(</span><span class="code4">Function</span><span class="code5">(i) i &gt;= 0) </span></pre> </div> <p>Dove la funzione RicercaNome, è così definita: </p> <style type="text/css"><![CDATA[ .code0 { font-size: small; font-family: consolas, "Courier New", courier, monospace; color: #000000; background-color: #ffffff; } .code1 { margin: 0em; } .code2 { margin: 0em; width: 100%; background-color: #f0f0f0; } .code3 { color: #808080; background-color: #ffffff; } .code4 { color: #0000ff; } .code5 { color: #000000; } .code6 { color: #6f002f; }]]></style> <div class="code0"> <pre class="code1"><span class="code3">1: </span><span class="code4">Private Function </span><span class="code5">RicercaNome(</span><span class="code4">ByVal </span><span class="code5">a </span><span class="code4">As </span><span class="code6">String</span><span class="code5">, </span><span class="code4">ByVal </span><span class="code5">b </span><span class="code4">As </span><span class="code6">String</span><span class="code5">, </span><span class="code4">ByVal </span><span class="code5">c </span><span class="code4">As </span><span class="code6">Integer</span><span class="code5">) </span><span class="code4">As </span><span class="code6">Integer</span></pre> <pre class="code2"><span class="code3">2: </span> <span class="code4">If </span><span class="code5">(a.Equals(b)) </span><span class="code4">Then </span></pre> <pre class="code1"><span class="code3">3: </span> <span class="code4">Return </span><span class="code5">c </span></pre> <pre class="code2"><span class="code3">4: </span> <span class="code4">Else </span></pre> <pre class="code1"><span class="code3">5: </span> <span class="code4">Return </span><span class="code5">-1 </span></pre> <pre class="code2"><span class="code3">6: </span> <span class="code4">End If </span></pre> <pre class="code1"><span class="code3">7: </span><span class="code4">End Function</span></pre> </div> <img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/97619.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2009/11/27/estrazione-di-indici-da-una-lista-con-linq.aspx Fri, 27 Nov 2009 15:09:07 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2009/11/27/estrazione-di-indici-da-una-lista-con-linq.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/97619.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/97619.aspx OrderBy (e OrderByDescending) e comparatori personalizzati http://blogs.ugidotnet.org/PietroLibroBlog/archive/2009/01/02/orderby-e-orderbydescending-e-comparatori-personalizzati.aspx <p>Supponiamo di lavorare con due classi del tipo seguente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/OrderByeOrderByDescendingecomparatoriper_11B47/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="105" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/OrderByeOrderByDescendingecomparatoriper_11B47/image_thumb.png" width="244" border="0" /></a> </p> <p>e di voler utilizzare <em>Linq To Objects</em> per eseguire delle operazioni sul nostro insieme di dati, composto da un array di oggetti <em>Documento</em>:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:cd3c2a62-9023-46d9-8d57-6e2f97ab366c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; width: 589px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">Documento[] documenti </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Documento[]{ </span><span style="color: #008080;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Documento (</span><span style="color: #800000;">"</span><span style="color: #800000;">10</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Cliente {Nome</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Pietro</span><span style="color: #800000;">"</span><span style="color: #000000;">,Cognome </span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Libro</span><span style="color: #800000;">"</span><span style="color: #000000;">,CodiceFiscale</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">ABA</span><span style="color: #800000;">"</span><span style="color: #000000;">}), </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Documento (</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Cliente {Nome</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Pietro</span><span style="color: #800000;">"</span><span style="color: #000000;">,Cognome </span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Bianchi</span><span style="color: #800000;">"</span><span style="color: #000000;">,CodiceFiscale</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">ABB</span><span style="color: #800000;">"</span><span style="color: #000000;">}), </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Documento (</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Cliente {Nome</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Giuseppe</span><span style="color: #800000;">"</span><span style="color: #000000;">,Cognome </span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Rossi</span><span style="color: #800000;">"</span><span style="color: #000000;">,CodiceFiscale</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">ABC</span><span style="color: #800000;">"</span><span style="color: #000000;">}), </span><span style="color: #008080;">5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Documento (</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Cliente {Nome</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Gabriele</span><span style="color: #800000;">"</span><span style="color: #000000;">,Cognome </span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">Bianchi</span><span style="color: #800000;">"</span><span style="color: #000000;">,CodiceFiscale</span><span style="color: #000000;">=</span><span style="color: #800000;">"</span><span style="color: #800000;">ABD</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>Supponiamo di voler utilizzare una <em>query expression</em> per ottenere una lista (nello specifico un  oggetto che implementi l'interfaccia <em>IEnumerable&lt;T&gt;</em>, o <em>IOrderedEnumerable&lt;T&gt;</em> che estende <em>IEnumerable&lt;t&gt;</em>), che possa essere "esplorata" mediante uno statement <em>foreach:</em></p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d4a68c63-6da0-4432-9612-c2ba8c2eafc7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">var result </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">2</span> <span style="color: #000000;"> from d </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> documenti </span><span style="color: #008080;">3</span> <span style="color: #000000;"> orderby d.Numero </span><span style="color: #008080;">4</span> <span style="color: #000000;"> select d;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Eseguendo il tutto in un'applicazione console otterremmo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/OrderByeOrderByDescendingecomparatoriper_11B47/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="107" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/OrderByeOrderByDescendingecomparatoriper_11B47/image_thumb_1.png" width="244" border="0" /></a> </p> <p>Che non è proprio quello che ci aspettiamo dato che 2 viene prima di 10. Il problema nasce dal fatto che nel nostro modello ad oggetti, abbiamo definito il campo <em>Numero</em>, della classe <em>Documento</em>, come String. A questo punto potremmo optare tra almeno due soluzioni: procediamo con un <em>refactoring</em> del codice e cambiamo il tipo del membro <em>Numero</em>, o utilizziamo un overload dell'Extension Method OrderBy (o OrderByDescending). Più precisamente, utilizzeremo <em>l'overload</em>  seguente:</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:83bb5825-79c7-4212-b805-43bebd8f171d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> IOrderedEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> OrderBy</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TSource, TKey</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">( </span><span style="color: #008080;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">this</span><span style="color: #000000;"> IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TSource</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> source, </span><span style="color: #008080;">3</span> <span style="color: #000000;"> Func</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TSource, TKey</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> keySelector, </span><span style="color: #008080;">4</span> <span style="color: #000000;"> IComparer</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TKey</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> comparer </span><span style="color: #008080;">5</span> <span style="color: #000000;">) </span><span style="color: #008080;">6</span> <span style="color: #000000;" /></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Il quale esegue l'ordinamento  ascendente di una sequenza di dati utilizzando uno specifico <em>Comparer. </em>Nello specifico, questo sarà così definito:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:77de5095-2f40-4bca-8cd6-88d29571369c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> DocumentoComparer : IComparer</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Documento</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 2</span> <span style="color: #000000;">{ </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> IComparer&lt;Documento&gt; Members</span><span style="color: #000000;"> </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> Compare(Documento x, Documento y) </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (x.Numero.Equals(y.Numero)) </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #008000;">//</span><span style="color: #008000;">Ordina in base al nominativo del cliente</span><span style="color: #008000;"> </span><span style="color: #008080;">10</span> <span style="color: #008000;" /><span style="color: #000000;"> </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Compare(x.Cliente.Cognome, y.Cliente.Cognome); </span><span style="color: #008080;">11</span> <span style="color: #000000;"> } </span><span style="color: #008080;">12</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> </span><span style="color: #008080;">13</span> <span style="color: #000000;"> { </span><span style="color: #008080;">14</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #0000FF;">int</span><span style="color: #000000;">.Parse(x.Numero) </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;">.Parse(y.Numero)) </span><span style="color: #008080;">15</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">16</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> </span><span style="color: #008080;">17</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">; </span><span style="color: #008080;">18</span> <span style="color: #000000;"> } </span><span style="color: #008080;">19</span> <span style="color: #000000;"> } </span><span style="color: #008080;">20</span> <span style="color: #000000;"> </span><span style="color: #008080;">21</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;"> </span><span style="color: #008080;">22</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>Nel caso in cui siano presenti due documenti con lo stesso numero, magari perchè di tipo diverso, l'ordinamento viene effettuato in base all'ordinamento lessicografico della proprietà Cognome del Cliente, altrimenti le stringhe <em>Numero</em> sono convertite nei rispettivi valori interi, quindi eseguito il confronto.</p> <p>A questo punto, mediante <em>method syntax</em>, possiamo scrivere:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:5016f294-0e67-4aa3-8ecc-aeeef9bf4002" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">var resultMethod </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">2</span> <span style="color: #000000;"> documenti </span><span style="color: #008080;">3</span> <span style="color: #000000;"> .OrderBy(d </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> d, </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> DocumentoComparer());</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Ottenendo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/OrderByeOrderByDescendingecomparatoriper_11B47/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="121" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/OrderByeOrderByDescendingecomparatoriper_11B47/image_thumb_2.png" width="243" border="0" /></a> </p> <p>Nel caso in cui non sia fornito un comparatore o che Comparer sia nullo verrà utilizzata la proprietà <em>Default</em>, di Comparer&lt;T&gt;, ovvero Comparer&lt;TKey&gt;.Default, ma se il tipo T (come ad esempio Documento) non implementa ne l'interfaccia IComparable&lt;T&gt; ne IComparable, in fase di esecuzione verrà generata un'eccezione.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:64188a16-fe0a-4126-bce1-01ca6d5d03f0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/Linq%20To%20Objects" rel="tag">Linq To Objects</a>,<a href="http://technorati.com/tags/OrderBy" rel="tag">OrderBy</a>,<a href="http://technorati.com/tags/OrderByDescending" rel="tag">OrderByDescending</a></div><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/95080.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2009/01/02/orderby-e-orderbydescending-e-comparatori-personalizzati.aspx Fri, 02 Jan 2009 20:58:43 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2009/01/02/orderby-e-orderbydescending-e-comparatori-personalizzati.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/95080.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/95080.aspx Passato e presente http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/10/21/94313.aspx <p>Mi trovavo ad analizzare un vecchio codice VB6 per un amico, ed ho trovato una possibile implementazione di un algorimo per la risoluzione del seguente problema: <em>Dato un array di double, trovare il valore minimo, escludendo dei valori, ad esempio, (0).</em></p> <p>Soluzione del passato trovata (VB6)</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:6c72ea5b-b074-4111-a346-eb756d8279ec" 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;">Function</span><span style="color: #000000;"> TrovaMinimo(dati() </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Double</span><span style="color: #000000;">, </span><span style="color: #0000FF;">Optional</span><span style="color: #000000;"> Except </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Double</span><span style="color: #000000;">) </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> i </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Integer</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> Minimo </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Double</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Dim</span><span style="color: #000000;"> numerodati </span><span style="color: #0000FF;">As</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Integer</span><span style="color: #000000;"> numerodati </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">UBound</span><span style="color: #000000;">(dati) Minimo </span><span style="color: #000000;">=</span><span style="color: #000000;"> dati(</span><span style="color: #800080;">1</span><span style="color: #000000;">) </span><span style="color: #0000FF;">If</span><span style="color: #000000;"> Except </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Then</span><span style="color: #000000;"> </span><span style="color: #0000FF;">For</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;"> </span><span style="color: #0000FF;">To</span><span style="color: #000000;"> numerodati </span><span style="color: #0000FF;">If</span><span style="color: #000000;"> dati(i) </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> Minimo </span><span style="color: #0000FF;">Then</span><span style="color: #000000;"> Minimo </span><span style="color: #000000;">=</span><span style="color: #000000;"> dati(i) </span><span style="color: #0000FF;">End</span><span style="color: #000000;"> </span><span style="color: #0000FF;">If</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Next</span><span style="color: #000000;"> i </span><span style="color: #0000FF;">Else</span><span style="color: #000000;"> </span><span style="color: #0000FF;">For</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;"> </span><span style="color: #0000FF;">To</span><span style="color: #000000;"> numerodati </span><span style="color: #0000FF;">If</span><span style="color: #000000;"> dati(i) </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> Minimo </span><span style="color: #0000FF;">And</span><span style="color: #000000;"> dati(i) </span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;"> Except </span><span style="color: #0000FF;">Then</span><span style="color: #000000;"> Minimo </span><span style="color: #000000;">=</span><span style="color: #000000;"> dati(i) </span><span style="color: #0000FF;">End</span><span style="color: #000000;"> </span><span style="color: #0000FF;">If</span><span style="color: #000000;"> </span><span style="color: #0000FF;">Next</span><span style="color: #000000;"> i </span><span style="color: #0000FF;">End</span><span style="color: #000000;"> </span><span style="color: #0000FF;">If</span><span style="color: #000000;"> TrovaMinimo </span><span style="color: #000000;">=</span><span style="color: #000000;"> Minimo </span><span style="color: #0000FF;">End Function</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Se il valore del parametro <em>Except</em> è minore di zero, viene trovato il minimo considerando tutti i valori nell'array, altrimenti si cerca l'elemento minimo, escludendo il valore di <em>Except</em></p> <p>Come potrebbe essere implementata una possibile soluzione del problema, sfruttando le tecnologie attuali: </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:c8dc8bdb-499e-477c-b4d6-e9d5aa97f807" 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;">using</span><span style="color: #000000;"> System.Linq; ... </span><span style="color: #0000FF;">double</span><span style="color: #000000;">[] data </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Double[] { </span><span style="color: #800080;">28</span><span style="color: #000000;">, </span><span style="color: #800080;">25</span><span style="color: #000000;"> ,</span><span style="color: #800080;">0</span><span style="color: #000000;">}; </span><span style="color: #008000;">//</span><span style="color: #008000;">Ritorna il valore minimo escludendo il valore 0</span><span style="color: #008000;"> </span><span style="color: #000000;">Console.WriteLine(data.Where(d </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> d </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">).ToArray().Min().ToString(</span><span style="color: #800000;">"</span><span style="color: #800000;">N</span><span style="color: #800000;">"</span><span style="color: #000000;">)); </span><span style="color: #008000;">//</span><span style="color: #008000;">Ritorna il valore minimo</span><span style="color: #008000;"> </span><span style="color: #000000;">Console.WriteLine(data.Min().ToString(</span><span style="color: #800000;">"</span><span style="color: #800000;">N</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><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/94313.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/10/21/94313.aspx Tue, 21 Oct 2008 19:10:12 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/10/21/94313.aspx#feedback 2 http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/94313.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/94313.aspx WPF + LINQ + CollectionViewSource = Rss Reader http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/08/27/93837.aspx <p>Questo post è nato con uno scopo diverso da quello dell'implementazione di un Rss Reader, dato che, è sufficiente cercare su internet per trovarne di belli e pronti, ma per enfatizzare alcune proprietà molto interessanti dei controlli WPF, come  la possibilità di eseguire il raggruppamento dei dati nei controlli ListBox o ListView. Piccola parentesi: per chi volesse conoscere in dettaglio le specifiche RSS 2.0 le può trovare <a href="http://www.rssboard.org/rss-specification" target="_blank">qui</a>. Iniziamo sviluppando un <em>set </em>di classi come riassunto dal seguente <em>Class Diagram</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/WPFLINQCollectionViewSourceRssReader_E870/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/WPFLINQCollectionViewSourceRssReader_E870/image_thumb.png" width="235" border="0" /></a> </p> <p>Nel resto dell'esempio saranno prese in considerazione solo istanze di tipo Rss e RssItem. Generalmente, senza considerare gli elementi opzionali, la struttura xml di un documento RSS è il seguente:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:e5c0d61e-f7e6-4957-92be-0adb2300c1d9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">rss </span><span style="color: #FF0000;">version</span><span style="color: #0000FF;">="2.0"</span><span style="color: #FF0000;"> xmlns:dc</span><span style="color: #0000FF;">="http://purl.org/dc/elements/1.1/"</span><span style="color: #FF0000;"> ... </span><span style="color: #008080;"> 2</span> <span style="color: #FF0000;"> &lt;channel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Il blog di Pietro Libro</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">link</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">link</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">description </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">language</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">it-IT</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">language</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">copyright</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Pietro Libro</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">copyright</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">managingEditor</span><span style="color: #0000FF;">&gt;&lt;/</span><span style="color: #800000;">managingEditor</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">generator</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Subtext Version 1.9.5.176</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">generator</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">10</span> <span style="color: #000000;"> ... </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">item</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">12</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Adeona, il software </span><span style="color: #FF0000;">&amp;amp;</span><span style="color: #000000;">quot;salva</span><span style="color: #FF0000;">&amp;amp;</span><span style="color: #000000;">quot; notebook</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">13</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">category</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">OT</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">category</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">14</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">category</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Varie ed eventuali</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">category</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">15</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">link</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/08/26/93820.aspx</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">link</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">16</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">description</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">...</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">description</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">17</span> <span style="color: #000000;"> .... </span><span style="color: #008080;">18</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">item</span><span style="color: #0000FF;">&gt;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Per leggere un tale documento, utilizziamo un'istanza della classe <em>XDocument</em>, presente nel namespace <em>System.Xml.Linq</em>, contenente metodi che permettono la navigazione dei nodi del documento in maniera molto semplice. Se a questo aggiungiamo la potenza di Linq, veramente c'è poco da dire. Prima di tutto creiamo un'istanza  di <em>XDocument</em> e leggiamo il documento passando direttamente l'uri del fornitore del feed RSS:</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f84a27f6-7338-4fe1-b674-d2d06bfa73a2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">XDocument xDocument </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> XDocument(); </span><span style="color: #008080;">2</span> <span style="color: #000000;">xDocument </span><span style="color: #000000;">=</span><span style="color: #000000;"> XDocument.Load(blogUri);</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Per recuperare tutti gli elementi <em>item</em> contenuti nel documento, utilizziamo Linq. Per far questo utilizziamo il metodo <em>Descendants </em>passando come parametro la stringa "Item":</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:e28f058d-2c78-41b2-9a13-8972c4f3e69e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">_items </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">2</span> <span style="color: #000000;"> (from item </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> xDocument.Descendants(</span><span style="color: #800000;">"</span><span style="color: #800000;">item</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #008080;">3</span> <span style="color: #000000;"> select </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> RssItem </span><span style="color: #008080;">4</span> <span style="color: #000000;"> { </span><span style="color: #008080;">5</span> <span style="color: #000000;"> Title </span><span style="color: #000000;">=</span><span style="color: #000000;"> item.Element(</span><span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value, </span><span style="color: #008080;">6</span> <span style="color: #000000;"> Description </span><span style="color: #000000;">=</span><span style="color: #000000;">item.Element (</span><span style="color: #800000;">"</span><span style="color: #800000;">description</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value, </span><span style="color: #008080;">7</span> <span style="color: #000000;"> Category </span><span style="color: #000000;">=</span><span style="color: #000000;"> item.Element(</span><span style="color: #800000;">"</span><span style="color: #800000;">category</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Nessuna Categoria</span><span style="color: #800000;">"</span><span style="color: #000000;"> : item.Element(</span><span style="color: #800000;">"</span><span style="color: #800000;">category</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value , </span><span style="color: #008080;">8</span> <span style="color: #000000;"> Link </span><span style="color: #000000;">=</span><span style="color: #000000;"> item.Element(</span><span style="color: #800000;">"</span><span style="color: #800000;">link</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;">: item.Element(</span><span style="color: #800000;">"</span><span style="color: #800000;">link</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value </span><span style="color: #008080;">9</span> <span style="color: #000000;"> }).ToList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">RssItem</span><span style="color: #000000;">&gt;</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> <em>_items </em>è una lista tipizzata di oggetti <em>RssItem</em>.</p> <p>Per presentare i dati recuperati  utilizziamo una Window WPF. Il nostro obiettivo è mostrare i dati raggruppati per categoria, ovvero ottenere qualcosa del tipo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/WPFLINQCollectionViewSourceRssReader_E870/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="168" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/WPFLINQCollectionViewSourceRssReader_E870/image_thumb_1.png" width="244" border="0" /></a> </p> <p>Per raggiungere il <em>goal</em>,  invece di utilizzare la proprietà <em>ItemSource</em> esposta dal controllo ListBox, utilizziamo un'istanza di oggetto di tipo <em>CollectionViewSource </em>la quale altro non è una che un Proxy della classe <em>CollectionView</em>.<em> </em>Quest'ultima permette di eseguire operazioni di raggruppamento, ordinamento, navigazione e ricerca su di una collezione di dati. Definiamo un'istanza di tipo <em>CollectionViewSource</em> nella collezione <em>Window.Resources</em> della nostra Window WPF:</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:7fc65c71-8203-4310-b845-81716ee5bc04" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">CollectionViewSource </span><span style="color: #FF0000;">x:Key</span><span style="color: #0000FF;">="cvs"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">CollectionViewSource.GroupDescriptions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">PropertyGroupDescription </span><span style="color: #FF0000;">PropertyName</span><span style="color: #0000FF;">="Category"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">CollectionViewSource.GroupDescriptions</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">5</span> <span style="color: #000000;"></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">CollectionViewSource</span><span style="color: #0000FF;">&gt;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Così facendo, aggiungiamo alla collezione <em>GroupDescriptions</em> un oggetto di tipo <em>GroupDescription</em> che descrive il criterio in base al quale i  dati devono essere raggruppati nella vista, nello specifico in base al valore della proprietà <em>Category. </em></p> <p>Tramite codice XAML, andiamo a descrivere come devono essere visualizzati i nostri Gruppi:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d8dcf354-87c3-490b-b315-961b34bd8f4a" 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: #008080;"> 1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Style </span><span style="color: #FF0000;">x:Key</span><span style="color: #0000FF;">="CustomGroupStyle"</span><span style="color: #FF0000;"> TargetType</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{x:Type GroupItem}</span><span style="color: #0000FF;">"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setter </span><span style="color: #FF0000;">Property</span><span style="color: #0000FF;">="Margin"</span><span style="color: #FF0000;"> Value</span><span style="color: #0000FF;">="0,0,0,5"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setter </span><span style="color: #FF0000;">Property</span><span style="color: #0000FF;">="Template"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Setter.Value</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ControlTemplate </span><span style="color: #FF0000;">TargetType</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{x:Type GroupItem}</span><span style="color: #0000FF;">"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Expander </span><span style="color: #FF0000;">IsExpanded</span><span style="color: #0000FF;">="False"</span><span style="color: #FF0000;"> BorderBrush</span><span style="color: #0000FF;">="#FFA4B97F"</span><span style="color: #FF0000;"> BorderThickness</span><span style="color: #0000FF;">="0,0,0,1"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Expander.Header</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">DockPanel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">TextBlock </span><span style="color: #FF0000;">FontWeight</span><span style="color: #0000FF;">="Bold"</span><span style="color: #FF0000;"> Text</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{Binding Path=Name}</span><span style="color: #0000FF;">"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">TextBlock </span><span style="color: #FF0000;">FontWeight</span><span style="color: #0000FF;">="Bold"</span><span style="color: #FF0000;"> Text</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{Binding Path=ItemCount, </span><span style="color: #008080;">11</span> <span style="color: #808000;"> Converter={StaticResource CustomConverter}, </span><span style="color: #008080;">12</span> <span style="color: #808000;"> ConverterParameter=' - Numero di post ({0}) '}</span><span style="color: #0000FF;">"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">13</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">DockPanel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">14</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Expander.Header</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">15</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Expander.Content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">16</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ItemsPresenter </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">17</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Expander.Content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">18</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Expander</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">19</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ControlTemplate</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">20</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Setter.Value</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">21</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Setter</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">22</span> <span style="color: #000000;"></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Style</span><span style="color: #0000FF;">&gt;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>E gli elementi in essi contenuti:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:9fc85a15-059e-450d-a289-885b0f87b352" 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: #008080;">1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">DataTemplate </span><span style="color: #FF0000;">x:Key</span><span style="color: #0000FF;">="ItemTemplate"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">StackPanel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">TextBlock </span><span style="color: #FF0000;">Text</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{Binding Path=Title}</span><span style="color: #0000FF;">"</span><span style="color: #0000FF;">&gt;&lt;/</span><span style="color: #800000;">TextBlock</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">TextBlock</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Hyperlink </span><span style="color: #FF0000;">NavigateUri</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{Binding Path=Link}</span><span style="color: #0000FF;">"</span><span style="color: #FF0000;"> Click</span><span style="color: #0000FF;">="Hyperlink_Click"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Visualizza</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Hyperlink</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">TextBlock</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">7</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">StackPanel</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">8</span> <span style="color: #000000;"></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">DataTemplate</span><span style="color: #0000FF;">&gt;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Non resta che definire il controllo ListBox:</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:006c92bc-bc95-4c9a-8509-9c5021363426" 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: #008080;">1</span> <span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ListBox </span><span style="color: #FF0000;">Name</span><span style="color: #0000FF;">="lstBox"</span><span style="color: #FF0000;"> ItemTemplate</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{StaticResource ItemTemplate}</span><span style="color: #0000FF;">"</span><span style="color: #FF0000;"> Margin</span><span style="color: #0000FF;">="12,41,12,12"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">2</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">ListBox.GroupStyle</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">GroupStyle </span><span style="color: #FF0000;">ContainerStyle</span><span style="color: #0000FF;">="</span><span style="color: #808000;">{StaticResource CustomGroupStyle}</span><span style="color: #0000FF;">"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ListBox.GroupStyle</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"> </span><span style="color: #008080;">5</span> <span style="color: #000000;"></span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">ListBox</span><span style="color: #0000FF;">&gt;</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Utilizzando un controllo Button per recuperare il contenuto del documento RSS, scriviamo il seguente codice C#:</p> <p> </p><div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:8ac5a0ee-ef6e-4cac-9501-a2d6b091fd75" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">LinqRss.Rss rss </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> LinqRss.Rss(); </span><span style="color: #008080;">2</span> <span style="color: #000000;"></span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (rss.Load(</span><span style="color: #800000;">"</span><span style="color: #800000;">http://blogs.ugidotnet.org/PietroLibroBlog/Rss.aspx</span><span style="color: #800000;">"</span><span style="color: #000000;">)) </span><span style="color: #008080;">3</span> <span style="color: #000000;">{ </span><span style="color: #008080;">4</span> <span style="color: #000000;"> CollectionViewSource collectionViewSource </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">this</span><span style="color: #000000;">.FindResource(</span><span style="color: #800000;">"</span><span style="color: #800000;">cvs</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000FF;">as</span><span style="color: #000000;"> CollectionViewSource ; </span><span style="color: #008080;">5</span> <span style="color: #000000;"> collectionViewSource.Source </span><span style="color: #000000;">=</span><span style="color: #000000;"> rss.Items; </span><span style="color: #008080;">6</span> <span style="color: #000000;"> lstBox.ItemsSource </span><span style="color: #000000;">=</span><span style="color: #000000;"> collectionViewSource.View; </span><span style="color: #008080;">7</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>In sintesi, recuperata l'istanza di <em>CollectionViewSource </em>contenuta nelle risorse della nostra Window WPF,  impostiamo la proprietà <em>Source</em> dell'oggetto <em>CollectionViewSource</em> utilizzando la collezione <em>Items</em> esposta dall'istanza <em>Rss</em>. Non resta che impostare la proprietà <em>ItemSource</em> del controllo ListBox con la proprietà <em>View</em> esposta da <em>CollectionViewSource</em>. Osservazione: i <em>GroupItem</em> sono costituiti da controlli <em>Expander. </em>Nell'I<em>temTemplate</em> è presente anche un <em>HyperLink</em> che permette la navigazione verso il post d'interesse.</p> <p><a href="http://www.pietrolibro.name/sources/LinqWpfRssReader.zip" target="_blank">Codice C# e XAML</a></p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:902c7c58-3a46-42dd-a906-877a496df2f1" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/CollectionViewSource" rel="tag">CollectionViewSource</a></div><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/93837.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/08/27/93837.aspx Wed, 27 Aug 2008 14:30:58 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/08/27/93837.aspx#feedback 9 http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/93837.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/93837.aspx Linq: ThenBy e ThenByDescending http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/05/16/92694.aspx <p>Se abbiamo la necessità di ordinare una query Linq per più campi possiamo utilizzare gli operatori ThenBy e ThenByDescending. <a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/05/09/92586.aspx" target="_blank">Considerando le classi del post precedente</a>, se volessimo ordinare  la query:</p> <p></p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:81f973bc-db22-41b1-bfeb-c71803cc81b0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">var query1 </span><span style="color: #000000;">=</span><span style="color: #000000;"> esamiSostenuti </span><span style="color: #008080;">2</span> <span style="color: #000000;"> .OrderBy(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> es.ID_Studente) </span><span style="color: #008080;">3</span> <span style="color: #000000;"> .Select(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> { es.ID_Studente, es.Voto });</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p></p> <p>non solo per il campo ID_Studente, ma anche per il campo Voto, possiamo scrivere:</p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:8769e025-809d-48ba-b6ba-b8fa4bcd87c4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;">Ordinamento Ascendente</span><span style="color: #008000;"> </span><span style="color: #008080;">2</span> <span style="color: #008000;"></span><span style="color: #000000;">var query2 </span><span style="color: #000000;">=</span><span style="color: #000000;"> esamiSostenuti </span><span style="color: #008080;">3</span> <span style="color: #000000;"> .OrderBy(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> es.ID_Studente) </span><span style="color: #008080;">4</span> <span style="color: #000000;"> .ThenBy(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> es.Voto) </span><span style="color: #008080;">5</span> <span style="color: #000000;"> .Select(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> { es.ID_Studente, es.Voto });</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Mentre per eseguire l'ordinamento  in modo discendente scriviamo:</p> <p></p> <div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ecf47542-daf5-420a-ad7b-e5ca84dcb89f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;">Ordinamento Discendente</span><span style="color: #008000;"> </span><span style="color: #008080;">2</span> <span style="color: #008000;"></span><span style="color: #000000;">var query3 </span><span style="color: #000000;">=</span><span style="color: #000000;"> esamiSostenuti </span><span style="color: #008080;">3</span> <span style="color: #000000;"> .OrderBy(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> es.ID_Studente) </span><span style="color: #008080;">4</span> <span style="color: #000000;"> .ThenByDescending(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> es.Voto) </span><span style="color: #008080;">5</span> <span style="color: #000000;"> .Select(es </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> { es.ID_Studente, es.Voto });</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p></p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:226fe488-b383-4541-b044-36ba330eb380" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/Linq" rel="tag">Linq</a>,<a href="http://technorati.com/tags/ThenBy" rel="tag">ThenBy</a>,<a href="http://technorati.com/tags/ThenByDescending" rel="tag">ThenByDescending</a></div><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/92694.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/05/16/92694.aspx Fri, 16 May 2008 09:49:57 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2008/05/16/92694.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/92694.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/92694.aspx