{"id":815,"date":"2010-03-13T02:47:34","date_gmt":"2010-03-12T18:47:34","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=815"},"modified":"2011-03-08T11:43:04","modified_gmt":"2011-03-08T03:43:04","slug":"utilizando-linq-to-objetcs-em-delphi-prism-2","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/","title":{"rendered":"Utilizando LINQ to Objetcs em Delphi Prism"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-773\" style=\"border: 0pt none; margin: 4px;\" title=\"Delphi Prism\" src=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism.png\" alt=\"\" width=\"175\" height=\"175\" srcset=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism.png 175w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism-80x80.png 80w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism-36x36.png 36w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism-120x120.png 120w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism-144x144.png 144w, http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism-150x150.png 150w\" sizes=\"(max-width: 175px) 100vw, 175px\" \/>Durante os \u00faltimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram in\u00fameras evolu\u00e7\u00f5es, todos n\u00f3s sabemos estas foram para melhor, mas em especial uma eu considero como uma das maiores inova\u00e7\u00f5es dos \u00faltimos 10 anos e se chama LINQ.<\/p>\n<p>LINQ \u00e9 um conjunto de extens\u00f5es para o .NET Framework que abrange opera\u00e7\u00f5es de consulta integrada \u00e0 linguagem, defini\u00e7\u00e3o e transforma\u00e7\u00e3o. Atrav\u00e9s de qualquer linguagem para .NET voc\u00ea pode efetuar consultas atrav\u00e9s de bibliotecas de classes para tirar proveito desses recursos.<\/p>\n<p>Existem v\u00e1rias formas de utiliza\u00e7\u00e3o do LINQ, consultando objetos, XML e banco de dados, j\u00e1 existem outras implementa\u00e7\u00f5es que permitem efetuar consulta em outros artefatos.<\/p>\n<p>Para come\u00e7ar a entender, vou exemplificar a utiliza\u00e7\u00e3o de LINQ consultando uma lista de objetos, mais conhecido como LINQ to Objects.<\/p>\n<p>O c\u00f3digo fonte dos exemplos aqui utilizando se encontram no diret\u00f3rio de exemplos do Delphi Prism, pasta Linq, estes foram desenvolvidos por mim mesmo e incorporados ao produto.<\/p>\n<p>Veja a classe abaixo, esta cont\u00e9m um Array of String, imagine a situa\u00e7\u00e3o onde voc\u00ea deseja filtrar estes dados, ordenar de diversas formas e o retorno ser uma classe. Isso \u00e9 o que podemos fazer com LINQ.<\/p>\n<pre class=\"brush: delphi\">type\r\n  Words = public class\r\n  private\r\n    words : Array of String := ['hello', 'Delphi Prism', 'wonderful', 'linq', 'beautiful', 'world' ];\r\n  public\r\n    method SimpleSelect;\r\n    method ComplexSelect;\r\n  end;<\/pre>\n<p>Abaixo temos a implementa\u00e7\u00e3o do m\u00e9todo SimpleSelect, onde utilizamos LINQ para trazer uma lista com as palavras que tenham menos de 5 caracteres.<\/p>\n<pre class=\"brush: delphi\">implementation\r\n\r\nmethod Words.SimpleSelect;\r\nbegin\r\n  var shortwords := From word in words\r\n                    Where word.Length &lt;= 5\r\n                    Select word;\r\n\r\n  Console.WriteLine('Simple select statment');\r\n  Console.WriteLine;\r\n\r\n  for each word in shortwords do begin\r\n    Console.WriteLine(word);\r\n  end;\r\n\r\nend;<\/pre>\n<p>Vamos passo a passo neste c\u00f3digo, primeira parte.<\/p>\n<li><strong>Vari\u00e1vel shorwords<\/strong> &#8211; representa uma collection de strings, neste caso, pois o retorno ser\u00e1 string.<\/li>\n<li><strong>From word<\/strong> &#8211; nome da vari\u00e1vel a ser utilizada para cada item selecionado no Array de String<\/li>\n<li><strong>in words<\/strong> &#8211; cole\u00e7\u00e3o onde ser\u00e1 efetuada a consulta, no mundo do banco de dados seria nossa tabela<\/li>\n<li><strong>Where word.Length &lt;= 5<\/strong> &#8211; filtra as palavras que tenham tamanho &lt;= 5, veja que est\u00e1 sendo utilizada a vari\u00e1vel word<\/li>\n<li><strong>Select word<\/strong> &#8211; representa o item que ser\u00e1 retornado para cada item da cole\u00e7\u00e3o, seria o nosso registro<\/li>\n<pre class=\"brush: delphi\">  var shortwords := From word in words\r\n                    Where word.Length &lt;= 5\r\n                    Select word;\r\nend;<\/pre>\n<p>Desta forma temos uma cole\u00e7\u00e3o chamada shortwords, cria din\u00e2micamente e que podemos agora percorrer e apresentar os resultados da seguinte forma.<\/p>\n<pre class=\"brush: delphi\">  for each word in shortwords do begin\r\n    Console.WriteLine(word);\r\n  end;<\/pre>\n<p>At\u00e9 aqui voc\u00ea se pergunta se \u00e9 poss\u00edvel ordenar, agrupar, etc. A resposta \u00e9 simples, sim \u00e9 poss\u00edvel. Abaixo um exemplo onde retornamos as palavras agrupadas por tamanho, em ordem descendente e gerando o retorno como uma classe e n\u00e3o apenas uma string.<\/p>\n<pre class=\"brush: delphi\">  var groups := From word in words\r\n                Order by word asc\r\n                Group word by word.Length into lengthGroups\r\n                Order by lengthGroups.Key desc\r\n                select new class (Length:=lengthGroups.Key,Words:=lengthGroups);<\/pre>\n<p>Foi adicionado as cl\u00e1usulas Order by e Group, onde Key \u00e9 o tamanho da string para cada item da cole\u00e7\u00e3o.<\/p>\n<p>Agora uma das coisas mais interessantes \u00e9 a cria\u00e7\u00e3o din\u00e2mica das classes atrav\u00e9s da sintaxe new class, al\u00e9m disso a utiliza\u00e7\u00e3o de express\u00f5es lambida onde eu defino a propriedade e valor a ser atribu\u00eddo dinamicamente, exemplo abaixo Length:=lengthGroups.Key .<\/p>\n<pre class=\"brush: delphi\">select new class (Length:=lengthGroups.Key,Words:=lengthGroups);<\/pre>\n<p>Caso voc\u00ea deseja imprimir o conte\u00fado agrupado, basta percorrer a vari\u00e1vel groups, onde a propriedade Words representa a lista de palavras para cada grupo.<\/p>\n<pre class=\"brush: delphi\">  for each grupo in groups do begin\r\n    Console.WriteLine('Words of length ' + grupo.Length);\r\n    for each word in grupo.Words do\r\n      Console.WriteLine('   ' + word);\r\n  end;<\/pre>\n<p>Pr\u00f3ximo post falarei sobre LINQ to XML, aguardem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durante os \u00faltimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram in\u00fameras evolu\u00e7\u00f5es, todos n\u00f3s sabemos estas foram para melhor, mas em especial uma eu considero como uma das maiores inova\u00e7\u00f5es dos \u00faltimos 10 anos e se chama LINQ. LINQ \u00e9 um conjunto de extens\u00f5es para o .NET Framework que abrange opera\u00e7\u00f5es de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"","footnotes":""},"categories":[48],"tags":[97,49],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Utilizando LINQ to Objetcs em Delphi Prism | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"Durante os \u00faltimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram in\u00fameras evolu\u00e7\u00f5es, todos n\u00f3s sabemos estas foram para\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Utilizando LINQ to Objetcs em Delphi Prism | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"Durante os \u00faltimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram in\u00fameras evolu\u00e7\u00f5es, todos n\u00f3s sabemos estas foram para\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2010-03-12T18:47:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2011-03-08T03:43:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"3 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_DelphiPrism.png\",\"width\":175,\"height\":175},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/\",\"name\":\"Utilizando LINQ to Objetcs em Delphi Prism | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#primaryimage\"},\"datePublished\":\"2010-03-12T18:47:34+00:00\",\"dateModified\":\"2011-03-08T03:43:04+00:00\",\"description\":\"Durante os \\u00faltimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram in\\u00fameras evolu\\u00e7\\u00f5es, todos n\\u00f3s sabemos estas foram para\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Utilizando LINQ to Objetcs em Delphi Prism\",\"datePublished\":\"2010-03-12T18:47:34+00:00\",\"dateModified\":\"2011-03-08T03:43:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#webpage\"},\"commentCount\":1,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#primaryimage\"},\"keywords\":[\"Delphi Prism\",\"LINQ\"],\"articleSection\":[\"Delphi Prism (.NET)\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/utilizando-linq-to-objetcs-em-delphi-prism-2\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/815"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=815"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/815\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=815"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}