<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Alberto Diaz : LINQ, .NET Framework</title><link>http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ/.NET+Framework/default.aspx</link><description>Etiquetas: LINQ, .NET Framework</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>LINQ. Enigma recursivo</title><link>http://geeks.ms/blogs/adiazmartin/archive/2010/12/09/linq-enigma-recursivo.aspx</link><pubDate>Thu, 09 Dec 2010 11:23:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185789</guid><dc:creator>Alberto Diaz Martin</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/adiazmartin/rsscomments.aspx?PostID=185789</wfw:commentRss><comments>http://geeks.ms/blogs/adiazmartin/archive/2010/12/09/linq-enigma-recursivo.aspx#comments</comments><description>&lt;p&gt;Lo tengo que reconocer, soy un viciado de las consultas SQL. Me recuerdan a los problemas de l&amp;oacute;gica en los que ten&amp;iacute;as que averiguar qui&amp;eacute;n hace qu&amp;eacute; y c&amp;oacute;mo, y resolver un enigma. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/logic_5F00_tapa_5F00_616F388A.jpg"&gt;&lt;img height="244" width="167" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/logic_5F00_tapa_5F00_thumb_5F00_31B0CE64.jpg" alt="logic_tapa" border="0" title="logic_tapa" style="background-image:none;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;border:0px;" /&gt;&lt;/a&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/logicextra_5F00_tapa_5F00_36B30C13.jpg"&gt;&lt;img height="244" width="168" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/logicextra_5F00_tapa_5F00_thumb_5F00_7B12FD52.jpg" alt="logicextra_tapa" border="0" title="logicextra_tapa" style="background-image:none;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;border:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pues as&amp;iacute; veo las consultas SQL, como un enigma a resolver. Me he pasado horas d&amp;aacute;ndole vueltas a las consultas para hacer joins imposibles y subconsultas buscando obtener los datos en una sola llamada y con el mejor rendimiento posible. La verdad es que, a veces, echo de menos esas consultas de varias p&amp;aacute;ginas tiradas en el Administrador de consultas del SQL Server 6.5 o 2000.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/70_2D00_228_2D00_6_2D00_5_5F00_5FFA2E44.jpg"&gt;&lt;img height="181" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/70_2D00_228_2D00_6_2D00_5_5F00_thumb_5F00_3BA523F5.jpg" alt="70-228-6-5" border="0" title="70-228-6-5" style="background-image:none;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;border:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Con el tiempo vas evolucionando y te vas pasando a los ORM (Hibernate, LINQ to SQL, Entity Framework, LLBLGEN), y dejas de lanzar esas consultas y simplificas la l&amp;oacute;gica para que se adapten a las entidades, a&amp;uacute;n as&amp;iacute; segu&amp;iacute;as queriendo meter c&amp;oacute;digo en procedimientos almacenados para no olvidar aquella parte de ti, que controlas y que te gusta.&lt;/p&gt;
&lt;p&gt;Desde que naci&amp;oacute; LINQ me pareci&amp;oacute; el gran avance de la programaci&amp;oacute;n actual. Cuando lo empiezas a usar, te das cuenta que vas a dejar de echar de menos a aquellas consultas y empiezas a olvidarte de los procedimiento almacenados. Pasas a otro nivel.&lt;/p&gt;
&lt;p&gt;En ese nivel, empiezas a lanzar consultas sobre listas, enumerados y colecciones (y a todo lo que te echen por delante, que si no es consultable buscas la forma de que lo sea), y empieza a aparecer, de nuevo, los enigmas de aquellas consultas SQL, ahora en C#. &lt;/p&gt;
&lt;p&gt;No lo puedo evitar y busco siempre la mejor consulta y la m&amp;aacute;s eficiente, incluso me pongo a calcular el rendimiento de hacerla con LINQ y sin LINQ. &lt;/p&gt;
&lt;p&gt;El &amp;uacute;ltimo reto fue hacer una b&amp;uacute;squeda recursiva, a trav&amp;eacute;s de listas de elementos enlazados con listas de esos elementos, utilizando LINQ.&amp;nbsp; Partimos de la siguiente clase que contiene una lista de elementos hijos de su misma clase.&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Organizacion&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Guid ID { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; OrganizationProfile Profile { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; DisplayName { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Organizacion Parent { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Organizacion&amp;gt; Childs { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UserProfile Leader { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;UserProfile&amp;gt; Members { get; set; }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Necesit&amp;aacute;bamos realizar una b&amp;uacute;squeda recurrente en la lista principal que a su vez hiciera la misma b&amp;uacute;squeda en los hijos (List&amp;lt;Organizacion&amp;gt; Childs) que a su vez buscara en los hijos de los hijos de los hijos&amp;hellip; y as&amp;iacute; sucesivamente.&lt;/p&gt;
&lt;p&gt;Este problema lo solucionar&amp;iacute;amos con una b&amp;uacute;squeda recursiva que fuera recorriendo todos los elementos, bajando y realizando la b&amp;uacute;squeda en cada lista de hijos que fuera encontrando. &lt;/p&gt;
&lt;p&gt;C&amp;oacute;mo no me puedo estar quieto, me puse a buscar una soluci&amp;oacute;n que me permitiera hacer esa b&amp;uacute;squeda en una consulta LINQ y ya llegu&amp;eacute; a la soluci&amp;oacute;n de crearme un m&amp;eacute;todo extensor que utiliza el &lt;a target="_blank" href="http://blogs.msdn.com/b/madst/archive/2007/05/11/recursive-lambda-expressions.aspx"&gt;combinador Y&lt;/a&gt; para realizar lambdas recursivas. Este m&amp;eacute;todo qued&amp;oacute; tal como sigue:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; Func&amp;lt;A, R&amp;gt; Recursive&amp;lt;A, R&amp;gt;(Recursive&amp;lt;A, R&amp;gt; r);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Func&amp;lt;A, R&amp;gt; Y&amp;lt;A, R&amp;gt;(Func&amp;lt;Func&amp;lt;A, R&amp;gt;, Func&amp;lt;A, R&amp;gt;&amp;gt; f)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Recursive&amp;lt;A, R&amp;gt; rec = r =&amp;gt; a =&amp;gt; f(r(r))(a); &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; rec(rec);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Organizacion&amp;gt; Recorrer(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Organizacion&amp;gt; source, Func&amp;lt;Organizacion, &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt;&amp;gt; function)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    var traverse = Extensions.Y&amp;lt;IEnumerable&amp;lt;Organizacion&amp;gt;, IEnumerable&amp;lt;Organizacion&amp;gt;&amp;gt;(&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        f =&amp;gt; items =&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            var r = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Organizacion&amp;gt;(items.Where(function));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            r.AddRange(items.SelectMany(i =&amp;gt; f(i.Childs)));&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; r;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        });&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; traverse(source);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nos creamos un delegado de la funci&amp;oacute;n recursiva (Y) y la funci&amp;oacute;n que recorre todos los elementos navegando por la lista de Childs y devolviendo un enumerable de todos los elementos de todas las listas.&lt;/p&gt;
&lt;p&gt;Con lo que es muy sencillo y limpio (adem&amp;aacute;s de bonito y satisfactorio &lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/wlEmoticon_2D00_smile_5F00_4BD0EBEE.png" alt="Sonrisa" class="wlEmoticon wlEmoticon-smile" style="border-style:none;" /&gt; ) hacer la consulta para encontrar un elemento de todas las colecciones, utilizando el m&amp;eacute;todo extensor.&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Organizacion parentOrg = OrganizacionList.Recorrer(o =&amp;gt; o.DisplayName == manager[&lt;span style="color:#006080;"&gt;&amp;quot;Department&amp;quot;&lt;/span&gt;].ToString()).FirstOrDefault();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lo s&amp;eacute;, deber&amp;iacute;a de pasar m&amp;aacute;s tiempo haciendo otras cosas m&amp;aacute;s &amp;uacute;tiles, pero, y lo bien que me lo he pasado&amp;hellip;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos a todos&amp;hellip;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185789" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework+4.0/default.aspx">.NET Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>2ª Edición del Curso de Evolución del Acceso a Datos en Tenerife</title><link>http://geeks.ms/blogs/adiazmartin/archive/2010/06/25/2-170-edici-243-n-del-curso-de-evoluci-243-n-del-acceso-a-datos-en-tenerife.aspx</link><pubDate>Fri, 25 Jun 2010 07:31:10 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:178499</guid><dc:creator>Alberto Diaz Martin</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/adiazmartin/rsscomments.aspx?PostID=178499</wfw:commentRss><comments>http://geeks.ms/blogs/adiazmartin/archive/2010/06/25/2-170-edici-243-n-del-curso-de-evoluci-243-n-del-acceso-a-datos-en-tenerife.aspx#comments</comments><description>&lt;p&gt;La semana del &lt;strong&gt;5 de Julio&lt;/strong&gt; repetiremos el curso en &lt;strong&gt;Tenerife&lt;/strong&gt; sobre la &lt;strong&gt;&lt;a href="http://geeks.ms/blogs/adiazmartin/archive/2010/05/01/curso-de-evoluci-243-n-del-acceso-a-datos-en-tenerife.aspx"&gt;Evolución de la plataforma de Acceso a Datos en .NET&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/curso_5F00_evolucion_5F00_05C5BDB7.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" class="wlDisabledImage" title="curso_evolucion" border="0" alt="curso_evolucion" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adiazmartin/curso_5F00_evolucion_5F00_thumb_5F00_1440B9DC.jpg" width="644" height="153" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Algunos se quedaron sin ir a la primera edición y esperamos que esta segunda edición cumpla con las mismas espectativas que el anterior y que sigamos ofreciendo formación en .NET en Tenerife.&lt;/p&gt;  &lt;p&gt;Si estáis interesados y necesitáis más información la tenemos en el Centro de Formación de &lt;a href="http://www.gsc.es/formacion_empresas.asp"&gt;General de Software de Canarias&lt;/a&gt; y en el &lt;a href="http://www.gsc.es/documentos/formacion/HDLP012%20Indice%20Curso%20Evolucion%20de%20la%20plataforma%20de%20acceso%20a%20datos%20en%20.net%20-%202%20Edicion.pdf"&gt;documento del curso&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=178499" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework+4.0/default.aspx">.NET Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Entity+Framework+4.0/default.aspx">Entity Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ+to+SQL/default.aspx">LINQ to SQL</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Curso/default.aspx">Curso</category></item><item><title>Curso de Evolución del Acceso a Datos en Tenerife</title><link>http://geeks.ms/blogs/adiazmartin/archive/2010/05/01/curso-de-evoluci-243-n-del-acceso-a-datos-en-tenerife.aspx</link><pubDate>Sat, 01 May 2010 11:03:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:175959</guid><dc:creator>Alberto Diaz Martin</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/adiazmartin/rsscomments.aspx?PostID=175959</wfw:commentRss><comments>http://geeks.ms/blogs/adiazmartin/archive/2010/05/01/curso-de-evoluci-243-n-del-acceso-a-datos-en-tenerife.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe scrolling="no" frameborder="0" src="http://www.facebook.com/widgets/like.php?href=http://geeks.ms/blogs/adiazmartin/archive/2010/05/01/curso-de-evoluci-243-n-del-acceso-a-datos-en-tenerife.aspx" style="width:450px;height:31px;"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p align="justify"&gt;La semana del &lt;strong&gt;24 de Mayo&lt;/strong&gt; se ha organizado un curso en &lt;strong&gt;Tenerife&lt;/strong&gt; sobre la &lt;strong&gt;Evoluci&amp;oacute;n de la plataforma de Acceso a Datos en .NET &lt;/strong&gt;y tendr&amp;eacute; el placer de impartirlo.&lt;/p&gt;
&lt;p align="justify"&gt;Este curso pretende dar a conocer los modelos actuales de acceso a datos en .NET Framework y como aplicarlos para acceder a bases de datos desde los distintos tipos de aplicaciones que permite la plataforma. Nos centraremos en la versi&amp;oacute;n .NET Framework 4.0 y en Visual Studio 2010.&lt;/p&gt;
&lt;p&gt;La duraci&amp;oacute;n es de 20 horas y el contenido ser&amp;aacute;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Introducci&amp;oacute;n a ADO.NET&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LINQ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LINQ to SQL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WCF Data Services&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esperamos que sea el primero de una larga serie de cursos en Tenerife orientados a .NET y Visual Studio 2010.&lt;/p&gt;
&lt;p&gt;Si est&amp;aacute;is interesados y necesit&amp;aacute;is m&amp;aacute;s informaci&amp;oacute;n la tenemos en el Centro de Formaci&amp;oacute;n de &lt;a target="_blank" href="http://www.gsc.es/formacion_empresas.asp"&gt;General de Software de Canarias&lt;/a&gt; y en el &lt;a target="_blank" href="http://www.gsc.es/documentos/formacion/HDLP012%20&amp;Iacute;ndice%20Curso%20Evoluci&amp;oacute;n%20de%20la%20plataforma%20de%20acceso%20a%20datos%20en%20.net.pdf"&gt;documento del curso&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos a todos&amp;hellip;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=175959" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework+4.0/default.aspx">.NET Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Entity+Framework+4.0/default.aspx">Entity Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ+to+SQL/default.aspx">LINQ to SQL</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Curso/default.aspx">Curso</category></item><item><title>EF4. Consultas ordenadas aleatoriamente</title><link>http://geeks.ms/blogs/adiazmartin/archive/2010/04/05/ef4-consultas-ordenadas-aleatoriamente.aspx</link><pubDate>Mon, 05 Apr 2010 19:19:24 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:173873</guid><dc:creator>Alberto Diaz Martin</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/adiazmartin/rsscomments.aspx?PostID=173873</wfw:commentRss><comments>http://geeks.ms/blogs/adiazmartin/archive/2010/04/05/ef4-consultas-ordenadas-aleatoriamente.aspx#comments</comments><description>&lt;p&gt;Hace unos días &lt;a href="http://twitter.com/fisica3"&gt;@fisica3&lt;/a&gt; intentaba migrar un proyecto en LINQ to SQL a Entity Framework 4. El problema surgía cuando intentaba agregar al modelo una función SQL Server del tipo Composable.&lt;/p&gt;  &lt;p&gt;Este tipo de funciones no se pueden mapear en un modelo de entidades, para hacer uso de estas hay que construir el Query con Entity SQL y utilizar las funciones, por ejemplo:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ObjectContext(&lt;span style="color:#006080;"&gt;&amp;quot;Name=Entities&amp;quot;&lt;/span&gt;))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     ObjectQuery&amp;lt;EntidadResult&amp;gt; query = context.CreateQuery&amp;lt;EntidadResult&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;         (&lt;span style="color:#006080;"&gt;@&amp;quot;select value c.Nombre, Model.Store.GetApellidos(c.Apellido1, c.Apellidos2) from Entities.Clientes as c&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     ObjectResult&amp;lt;EntidadResult&amp;gt; result = query.Execute(MergeOption.NoTracking);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; result)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;{0} {1}&amp;quot;&lt;/span&gt;, item.Nombre, item.Apellidos);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El problema se produce si la función que queremos utilizar es parte de la condición de ordenación, la idea es utilizar una función que devuelve un GUID aleatorio para que la consulta se ordene aleatoriamente.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FUNCTION&lt;/span&gt; [dbo].[GetNewId]()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;RETURNS&lt;/span&gt; uniqueidentifier&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BEGIN&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;RETURN&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; ID &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; RandomView)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;END&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;VIEW&lt;/span&gt; [dbo].[RandomView]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; NEWID() &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; ID&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Si creamos un DataContext con LINQ to SQL y mapeamos la función GetNewId en nuestro modelo, tenemos la posibilidad de realizar nuestra consulta utilizando como ordenación el valor devuelto por la función.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MusicaDataClassesDataContext())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     var canciones = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; c &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; context.Canciones&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;                     orderby context.GetNewId()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; c;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     foreach (var item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; canciones)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;         Console.WriteLine(&amp;quot;{0} {1}&amp;quot;, item.CancionId, item.Album);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Entonces, ¿cómo podemos realizar esta consulta con Entity Framework?. &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Entity Framework nos permite hacer uso de la expresión LET, que se utiliza para introducir una variable en el ámbito que puede ser utilizado por las siguientes cláusulas de consulta.&amp;#160; Similar a las variables locales en un cuerpo de método, esto le da una manera de evitar evaluar una expresión común de varias veces por almacenarlo en una variable.&amp;#160; Esto puede ser muy útil incluso en consultas mucho más simples.&lt;/p&gt;

&lt;p&gt;Podemos crearnos una consulta con la expresión LET que contengan un valor aleatorio y este sería utilizado para la ordenación (algo parecido a la función que utilizamos en LINQ to SQL).&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MusicaEntities())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     var musica = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; context.Canciones&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;                  let guid = Guid.NewGuid()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;                  orderby guid&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;                  &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; p;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     foreach (var item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; musica)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         Console.WriteLine(&amp;quot;{0} - {1}&amp;quot;, item.CancionId, item.Album);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Entity Framework transforma el query anterior, con el let guid = Guid.NewGuid(), en la siguiente sentencia T-SQL, que contiene un subquery con la generación de nuestro GUID.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; [Project1].[CancionId] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [CancionId], [Project1].[Artista] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Artista], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; [Project1].[Album] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Album], [Project1].[Titulo] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Titulo], [Project1].[AñoAlbum] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [AñoAlbum], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; [Project1].[AñoRanking] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [AñoRanking], [Project1].[Ubicacion] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Ubicacion], [Project1].[Ranking99] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Ranking99]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; ( &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     [Extent1].[CancionId] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [CancionId],     [Extent1].[Artista] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Artista], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     [Extent1].[Album] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Album],     [Extent1].[Titulo] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Titulo], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     [Extent1].[AñoAlbum] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [AñoAlbum],     [Extent1].[AñoRanking] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [AñoRanking], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     [Extent1].[Ubicacion] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Ubicacion],     [Extent1].[Ranking99] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Ranking99], &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     NEWID() &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [C1]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; [dbo].[Canciones] &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Extent1]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt; )  &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Project1]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; [Project1].[C1] ASC&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Como vemos en la consulta transact, la función del CLR Guid.NewGuid se ha transformado en un NEWID() de T-SQL, con lo que se realiza la ordenación por ese campo aleatorio por fila.&lt;/p&gt;

&lt;p&gt;Aunque no podamos utilizar la función que nos devuelve un valor aleatorio del tipo GUID, Entity Framework tiene la herramienta necesaria para realizar este método sin necesidad de utilizar la función.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos a todos…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=173873" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework+4.0/default.aspx">.NET Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Entity+Framework+4.0/default.aspx">Entity Framework 4.0</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ+to+SQL/default.aspx">LINQ to SQL</category></item><item><title>Operadores LINQ</title><link>http://geeks.ms/blogs/adiazmartin/archive/2010/03/23/operadores-linq.aspx</link><pubDate>Tue, 23 Mar 2010 19:37:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:171125</guid><dc:creator>Alberto Diaz Martin</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/adiazmartin/rsscomments.aspx?PostID=171125</wfw:commentRss><comments>http://geeks.ms/blogs/adiazmartin/archive/2010/03/23/operadores-linq.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;LINQ (Language INtegrated Query)&lt;/strong&gt; nos permite escribir consultas (parecidas a consultas SQL) sobre nuestras colecciones (List, IEnumerable, &amp;hellip;). Con estos operadores est&amp;aacute;ndares, podremos hacer consultas determinando si existe un tipo de elemento o realizar una suma de la secuencia. B&amp;aacute;sicamente nos permite filtrar, enumerar y crear proyecciones de varios tipos de colecciones.&lt;/p&gt;
&lt;p&gt;En LINQ tenemos un amplio conjunto de operadores. La siguiente tabla muestra los operadores de LINQ y una breve descripci&amp;oacute;n de la funcionalidad que ofrecen.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="119"&gt;
&lt;p&gt;&lt;strong&gt;Operador&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="508"&gt;&lt;strong&gt;Descripci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Agregaci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Aggregate&lt;/td&gt;
&lt;td width="508"&gt;Realiza un m&amp;eacute;todo personalizado sobre una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Average&lt;/td&gt;
&lt;td width="508"&gt;Calcula el promedio de una secuencia de valores num&amp;eacute;ricos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Count&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el n&amp;uacute;mero de los elementos de una secuencia como un int&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;LongCount&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el n&amp;uacute;mero de los elementos de una secuencia como un largo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Min&lt;/td&gt;
&lt;td width="508"&gt;Encuentra el n&amp;uacute;mero m&amp;iacute;nimo de una secuencia de n&amp;uacute;meros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Max&lt;/td&gt;
&lt;td width="508"&gt;Encuentra el n&amp;uacute;mero m&amp;aacute;ximo de una secuencia de n&amp;uacute;meros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Sum&lt;/td&gt;
&lt;td width="508"&gt;Suma de los n&amp;uacute;meros en una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Concatenaci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Concat&lt;/td&gt;
&lt;td width="508"&gt;Concatena dos secuencias en una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Conversi&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Cast&lt;/td&gt;
&lt;td width="508"&gt;Convierte elementos de una secuencia en otro tipo dado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;OfType&lt;/td&gt;
&lt;td width="508"&gt;Filtra los elementos de una secuencia de un determinado tipo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ToArray&lt;/td&gt;
&lt;td width="508"&gt;Devuelve un Array de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ToDictionary&lt;/td&gt;
&lt;td width="508"&gt;Devuelve un Dictionary de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ToList&lt;/td&gt;
&lt;td width="508"&gt;Devuelve un List de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ToLookup&lt;/td&gt;
&lt;td width="508"&gt;Devuelve un Lookup de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ToSequence&lt;/td&gt;
&lt;td width="508"&gt;Devuelve un IEnumerable de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Elemento&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;DefaultIfEmpty&lt;/td&gt;
&lt;td width="508"&gt;Crea un elemento predeterminado para una secuencia vac&amp;iacute;a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ElementAt&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el elemento de un &amp;iacute;ndice determinado en una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ElementAtOrDefault&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el elemento de un &amp;iacute;ndice determinado en una secuencia o un valor predeterminado si el &amp;iacute;ndice est&amp;aacute; fuera del intervalo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;First&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el primer elemento de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;FirstOrDefault&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el primer elemento de una secuencia o un valor predeterminado si no se encuentra ning&amp;uacute;n elemento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Last&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el &amp;uacute;ltimo elemento de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;LastOrDefault&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el &amp;uacute;ltimo elemento de una secuencia o un valor predeterminado si no se encuentra ning&amp;uacute;n elemento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Single&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el &amp;uacute;nico elemento de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;SingleOrDefault&lt;/td&gt;
&lt;td width="508"&gt;Devuelve el &amp;uacute;nico elemento de una secuencia o un valor predeterminado si no se encuentra ning&amp;uacute;n elemento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Igualdad&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;SequenceEqual&lt;/td&gt;
&lt;td width="508"&gt;Compara dos secuencias para ver si son equivalentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Generaci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Empty&lt;/td&gt;
&lt;td width="508"&gt;Genera una secuencia vac&amp;iacute;a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Range&lt;/td&gt;
&lt;td width="508"&gt;Genera una secuencia dado un rango&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Repeat&lt;/td&gt;
&lt;td width="508"&gt;Genera una secuencia repitiendo un elemento un n&amp;uacute;mero determinado de veces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Agrupaci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;GroupBy&lt;/td&gt;
&lt;td width="508"&gt;Agrupa elementos de una secuencia por una agrupaci&amp;oacute;n dada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Enlazando&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;GroupJoin&lt;/td&gt;
&lt;td width="508"&gt;Realiza una combinaci&amp;oacute;n agrupada de dos secuencias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Join&lt;/td&gt;
&lt;td width="508"&gt;una combinaci&amp;oacute;n interna de dos secuencias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Ordenaci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;OrderBy&lt;/td&gt;
&lt;td width="508"&gt;Ordena una secuencia por valor (s) en orden ascendente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;OrderByDescending&lt;/td&gt;
&lt;td width="508"&gt;Ordena una secuencia por valor (s) en orden de descendente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ThenBy&lt;/td&gt;
&lt;td width="508"&gt;Ordena una secuencia que ya se ha ordenado en orden ascendente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;ThenByDescending&lt;/td&gt;
&lt;td width="508"&gt;Ordena una secuencia que ya se ha ordenado en orden descendente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Reverse&lt;/td&gt;
&lt;td width="508"&gt;Invierte el orden de los elementos de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Particionado&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Skip&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que omite un n&amp;uacute;mero determinado de elementos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;SkipWhile&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que omite elementos que no cumplen una expresi&amp;oacute;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Take&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que toma un n&amp;uacute;mero determinado de elementos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;TakeWhile&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que toma elementos que cumplen una expresi&amp;oacute;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Proyecci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Select&lt;/td&gt;
&lt;td width="508"&gt;Crea una proyecci&amp;oacute;n&amp;nbsp; a partir de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;SelectMany&lt;/td&gt;
&lt;td width="508"&gt;Crea una proyecci&amp;oacute;n One to Many de elementos de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Cuantificadores&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;All&lt;/td&gt;
&lt;td width="508"&gt;Determina si todos los elementos de una secuencia cumplen una condici&amp;oacute;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Any&lt;/td&gt;
&lt;td width="508"&gt;Determina si los elementos de una secuencia cumplen una condici&amp;oacute;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Contains&lt;/td&gt;
&lt;td width="508"&gt;Determina si una secuencia contiene un elemento determinado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Restricci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Where&lt;/td&gt;
&lt;td width="508"&gt;Filtra los elementos de una secuencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;&lt;strong&gt;Conjuntos&lt;/strong&gt;&lt;/td&gt;
&lt;td width="508"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Distinct&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia sin elementos duplicados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Except&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que representa la diferencia entre dos secuencias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Intersect&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que representa la intersecci&amp;oacute;n de dos secuencias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="119"&gt;Union&lt;/td&gt;
&lt;td width="508"&gt;Devuelve una secuencia que representa la uni&amp;oacute;n de dos secuencias &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;Vamos a ver algunos ejemplos de c&amp;oacute;digo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Average&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt;[] nums = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;[] {1,2,3,4,5,6,7,8,9};&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;double&lt;/span&gt; avg = nums.Average();&lt;/pre&gt;
&lt;pre&gt;Calculamos la media de los enteros del array.&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Where&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;IEnumerable&amp;lt;Customer&amp;gt; customersInTenerife = customers.Where(c =&amp;gt; c.City == &lt;span class="str"&gt;&amp;quot;Tenerife&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Buscamos los clientes cuya ciudad sea Tenerife.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;IEnumerable&amp;lt;Product&amp;gt; MostExpensive10 =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    products.OrderByDescending(p =&amp;gt; p.UnitPrice).Take(10);&lt;/pre&gt;
&lt;pre&gt;En este ejemplo, ordenamos los productos descendentemente por UnitPrice y luego &lt;/pre&gt;
&lt;pre&gt;seleccionamos 10 productos.&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skip&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;IEnumerable&amp;lt;Product&amp;gt; AllButMostExpensive10 =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    products.OrderByDescending(p =&amp;gt; p.UnitPrice).Skip(10);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Aqu&amp;iacute; ordenamos, de nuevo, descendentemente por UnitPrice y seleccionamos todos los elementos menos los 10 m&amp;aacute;s caros.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Join&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;var custOrders =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    customers.Join(orders, c =&amp;gt; c.CustomerID, o =&amp;gt; o.CustomerID,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                             (c, o) =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; { c.Name, o.OrderDate, o.Total }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                              );&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Enlazamos los clientes con sus facturas y devolvemos una lista con el nombre del cliente, la fecha de la factura y el total facturado.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OrderBy/ThenBy&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;IEnumerable&amp;lt;Product&amp;gt; orderedProducts =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    products.OrderBy(p =&amp;gt; p.Category).&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                   ThenByDescending(p =&amp;gt; p.UnitPrice).&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                   ThenBy(p =&amp;gt; p.Name);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La siguiente consulta ordena la lista de productos por Category, luego por UnitPrice descendiente y por &amp;uacute;ltimo por Name.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GroupBy&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;IEnumerable&amp;lt;IGrouping&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, Product&amp;gt;&amp;gt; productsByCategory =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    products.GroupBy(p =&amp;gt; p.Category);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Podemos agrupar los productos y obtener un IEnumerable agrupado que contenga la Category y los productos que corresponden a esa Category.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ToDictionary&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;,Order&amp;gt; orders =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    customers.SelectMany(c =&amp;gt; c.Orders).&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;              Where(o =&amp;gt; o.OrderDate.Year == 2005).&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;              ToDictionary(o =&amp;gt; o.OrderID);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Creamos un Dictionary seleccionando las Facturas de los clientes del a&amp;ntilde;o 2005, utilizando como clave el OrderID.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Any&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;bool&lt;/span&gt; result = customers.Any(c =&amp;gt; c.Name == &lt;span class="str"&gt;&amp;quot;Pepe&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Devuelve True si encuentra alg&amp;uacute;n cliente con el Name Pepe.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ForEach&lt;/strong&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;List&amp;lt;customer&amp;gt; customers = GetCustomers();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;customers.ForEach(p =&amp;gt; Insertar(p));&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Para cada cliente de la lista customers, ejecutamos el m&amp;eacute;todo Insertar pas&amp;aacute;ndole por par&amp;aacute;metro el elemento actual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si queremos m&amp;aacute;s informaci&amp;oacute;n sobre LINQ, lo mejor es pasarse por la &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;MSDN&lt;/a&gt; y leernos la documentaci&amp;oacute;n o alguno de los tutoriales que tenemos sobre &amp;eacute;l.&lt;/p&gt;
&lt;p&gt;Este es uno de los grandes avances que Microsoft incluy&amp;oacute; con el Framework 3.5 y que nos facilita bastante la vida y nos permite programar mejor y m&amp;aacute;s r&amp;aacute;pido.&lt;/p&gt;
&lt;p&gt;Espero que disfrut&amp;eacute;is tanto como yo escribiendo c&amp;oacute;digo y que lo hag&amp;aacute;is m&amp;aacute;s con LINQ, os lo recomiendo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos a todos&amp;hellip;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=171125" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://geeks.ms/blogs/adiazmartin/archive/tags/LINQ/default.aspx">LINQ</category></item></channel></rss>