<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.aspnet.sk/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>Duracellko.NET : LINQ</title><link>http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx</link><description>Štítky: LINQ</description><dc:language>sk-SK</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>LINQ 2 SQL a DataLoadOptions</title><link>http://blog.aspnet.sk/duracellko/archive/2008/10/09/linq-2-sql-a-dataloadoptions.aspx</link><pubDate>Thu, 09 Oct 2008 16:04:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:47535</guid><dc:creator>duracellko</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/duracellko/rsscomments.aspx?PostID=47535</wfw:commentRss><comments>http://blog.aspnet.sk/duracellko/archive/2008/10/09/linq-2-sql-a-dataloadoptions.aspx#comments</comments><description>&lt;p&gt;Už som si myslel, že som objavil nejakú chybu v LINQ 2 SQL, ale zase to bol skôr problém medzi klávesnicou a stoličkou. Mám nasledovný dátový model.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.aspnet.sk/blogs/duracellko/WindowsLiveWriter/LINQ2SQLaDataLoadOptions_F376/image_4.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="579" alt="DB model" src="http://blog.aspnet.sk/blogs/duracellko/WindowsLiveWriter/LINQ2SQLaDataLoadOptions_F376/image_thumb_1.png" width="685" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Zároveň som pri načítavaní kontaktov nastavil, aby sa spolu s nimi načítali aj EmailType a TelephoneType. Proste aby sa nepoužil lazy-loading. Zabezpečil som to nasledovným kódom.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;p&gt;partial void OnCreated()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;var dlo = new DataLoadOptions();&lt;/p&gt;
&lt;p&gt;dlo.LoadWith&amp;lt;EmailContact&amp;gt;(ec =&amp;gt; ec.EmailType);&lt;/p&gt;
&lt;p&gt;dlo.LoadWith&amp;lt;TelephoneContact&amp;gt;(tc =&amp;gt; tc.PhoneType);&lt;/p&gt;
&lt;p&gt;LoadOptions = dlo;&lt;/p&gt;
&lt;p&gt;} &lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Táto OnCreated metóda je priamo v triede odvodenej od DataContext.&lt;/p&gt;
&lt;p&gt;Lenže som sa veľmi čudoval, keď pri načítaní kontaktov sa mi vrátil prázdny zoznam, aj keď samozrejme nejaké dáta v DB boli. Ešte že debbuger zobrazuje SQL príkaz, ktorý sa posiela na SQL Server. A ten bol nasledovný.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;p&gt;SELECT [t0].[ContactType]&lt;/p&gt;
&lt;p&gt;FROM [Customer].[vContact] AS [t0]&lt;/p&gt;
&lt;p&gt;INNER JOIN [Customer].[vTelephoneType] AS [t1] ON [t1].[Id] = [t0].[PhoneTypeId]&lt;/p&gt;
&lt;p&gt;INNER JOIN [Customer].[vEmailType] AS [t2] ON [t2].[Id] = [t0].[EmailTypeId]&lt;/p&gt;
&lt;p&gt;WHERE [t0].[CustomerId] = @p0&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;A je jasné, že tento príkaz musí zakaždým vrátiť prázdny zoznam. Ak je v riadku uložený EmailContact, tak stĺpec PhoneTypeId je NULL, a teda vďaka operátoru INNER JOIN na view vTelephoneType sa tento riadok do výsledku nedostane. A naopak, ak je v riadku uložený TelephoneContact, tak stĺpec EmailTypeId je NULL, a zase vďaka operátoru INNER JOIN na view vEmailType sa tento riadok do výsledku nedostane. A prípad pre PostAddressContact ani netreba rozpisovať, pretože tam sú obidva stĺpce NULL.&lt;/p&gt;
&lt;p&gt;Najprv som si myslel, že programátori z MS spravili škôlkarskú chybu a dávajú INNER JOIN aj tam kde má byť LEFT JOIN. Ale začal som pátrať hlbšie, a tak som si otvoril &lt;a href="http://www.red-gate.com/products/reflector/"&gt;.NET Reflector&lt;/a&gt;. Ešte raz vďaka za tento najdôležitejší nástroj .NET developera. A tam som po dlhšom pátraní zistil, že predsa len sa niekedy používa LEFT JOIN a niekedy INNER JOIN. Ak stĺpec, ktorý obsahuje referenciu na nejakú entitu, nie je nullable a je na ňom definovaný foreign key, tak použije INNER JOIN, inak sa použije LEFT JOIN. Čo je celkom logické, pretože ak sú splnené tie dve podmienky, tak sa nám v SQL databáze nepodarí vložiť do daného stĺpca inú hodnotu, ako sa nachádza v referencovanej tabuľke. Takže INNER JOIN má za daných podmienok zmysel, pretože vždy bude existovať záznam v referencovanej tabuľke. Nezistil som síce ako zisťuje, či je nad daným stĺpcom fereign key, pretože táto možnosť sa nikde v LINQ 2 SQL designery nezadáva.&lt;/p&gt;
&lt;p&gt;Ale to nie je dôležite. Dôležite je, že mne stačilo zmeniť vlastnosti EmailTypeId a PhoneTypeId z &lt;strong&gt;int&lt;/strong&gt; na &lt;strong&gt;Nullable&amp;lt;int&amp;gt;&lt;/strong&gt; a všetko funguje tak, ako má. Samozrejme, že v databáze tieto stĺpce boli NULL, ale v Class modely neboli, pretože z business pohlady EmailContact musí mať uvedený EmailType a TelephoneContact musí mať uvedený TelephoneType. Takže, ak nikto nepokazí dáta v databáze, tak v Class modely dané vlastnosti nemuseli byť nullable.&lt;/p&gt;
&lt;!-- AddThis Button BEGIN --&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;var addthis_pub="spigi";&lt;/script&gt;&lt;a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', 'http://blog.aspnet.sk/duracellko/archive/2008/10/09/linq-2-sql-a-dataloadoptions.aspx', 'LINQ 2 SQL a DataLoadOptions')" onmouseout="addthis_close()" onclick="return addthis_sendto()"&gt;&lt;img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/&gt;&lt;/a&gt;&lt;script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;!-- AddThis Button END --&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=47535" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ+2+SQL/default.aspx">LINQ 2 SQL</category></item><item><title>Nájdite všetkých zákazníkov, ktorí si objednali všetky produkty z katalógu</title><link>http://blog.aspnet.sk/duracellko/archive/2008/04/03/n-225-jdite-v-etk-253-ch-z-225-kazn-237-kov-ktor-237-si-objednali-v-etky-produkty-z-katal-243-gu.aspx</link><pubDate>Thu, 03 Apr 2008 11:30:26 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:5604</guid><dc:creator>duracellko</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/duracellko/rsscomments.aspx?PostID=5604</wfw:commentRss><comments>http://blog.aspnet.sk/duracellko/archive/2008/04/03/n-225-jdite-v-etk-253-ch-z-225-kazn-237-kov-ktor-237-si-objednali-v-etky-produkty-z-katal-243-gu.aspx#comments</comments><description>&lt;p&gt;Trochu dlh&amp;#253; nadpis. Dnes som si spomenul na klasick&amp;#250; &amp;#250;lohu zo sk&amp;#250;&amp;#353;ky z datab&amp;#225;z. Jej presn&amp;#233; znenie je nadpis tohoto blogu. Pravdepodobne cieľom tohoto cvičenia je uk&amp;#225;zať, že SQL je str&amp;#225;&amp;#353;n&amp;#253; jazyk a že sa toto ľah&amp;#353;ie nap&amp;#237;&amp;#353;e v relačnej algebre.&lt;/p&gt;  &lt;p&gt;A pri &lt;a href="http://www.aspnet.sk/News-Polemika-Ako-sa-vyhybat-storkam-100076.aspx"&gt;diskusii o stored procedures&lt;/a&gt; ma napadlo, že či sa d&amp;#225; tento dopyt nap&amp;#237;sať v LINQ. D&amp;#225; sa a je to e&amp;#353;te kraj&amp;#353;ie ako v SQL.&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;var customersAllProducts = os.Customers.Where(&lt;/p&gt;    &lt;p style="margin-left:22px;"&gt;c =&amp;gt; !os.Products.Any(&lt;/p&gt;    &lt;p style="margin-left:44px;"&gt;p =&amp;gt; !c.Orders.Any(o =&amp;gt; o.Product == p)));&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;A vygenerovan&amp;#253; SQL pr&amp;#237;kaz je nasledovn&amp;#253;.&lt;/p&gt;  &lt;div class="code"&gt;   &lt;p&gt;SELECT [t0].[CustomerId]&lt;/p&gt;    &lt;p&gt;FROM [dbo].[Customer] AS [t0]&lt;/p&gt;    &lt;p&gt;WHERE NOT (EXISTS(&lt;/p&gt;    &lt;div style="margin-left:22px;"&gt;     &lt;p&gt;SELECT NULL AS [EMPTY] &lt;/p&gt;      &lt;p&gt;FROM [dbo].[Product] AS [t1]&lt;/p&gt;      &lt;p&gt;WHERE NOT (EXISTS(&lt;/p&gt;      &lt;div style="margin-left:22px;"&gt;       &lt;p&gt;SELECT NULL AS [EMPTY]&lt;/p&gt;        &lt;p&gt;FROM [dbo].[Order] AS [t2]&lt;/p&gt;        &lt;p&gt;WHERE ([t2].[ProductId] = [t1].[ProductId]) AND ([t2].[CustomerId] = [t0].[CustomerId]) &lt;/p&gt;        &lt;p&gt;))&lt;/p&gt;     &lt;/div&gt;      &lt;p&gt;))&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Ale celkom zauj&amp;#237;mav&amp;#225; vec je d&amp;#225;vať do SELECTu v EXISTS stĺpec NULL. Ja som tam vždy d&amp;#225;val prim&amp;#225;rny kľ&amp;#250;č.&lt;/p&gt;
&lt;!-- AddThis Button BEGIN --&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;var addthis_pub="spigi";&lt;/script&gt;&lt;a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', 'http://blog.aspnet.sk/duracellko/archive/2008/04/03/n-225-jdite-v-etk-253-ch-z-225-kazn-237-kov-ktor-237-si-objednali-v-etky-produkty-z-katal-243-gu.aspx', 'N&amp;#225;jdite všetk&amp;#253;ch z&amp;#225;kazn&amp;#237;kov, ktor&amp;#237; si objednali všetky produkty z katal&amp;#243;gu')" onmouseout="addthis_close()" onclick="return addthis_sendto()"&gt;&lt;img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/&gt;&lt;/a&gt;&lt;script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;!-- AddThis Button END --&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=5604" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/SQL/default.aspx">SQL</category></item><item><title>ADO.NET Entity Framework Beta 3</title><link>http://blog.aspnet.sk/duracellko/archive/2007/12/13/ado-net-entity-framework-beta-3.aspx</link><pubDate>Thu, 13 Dec 2007 07:11:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:1003</guid><dc:creator>duracellko</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/duracellko/rsscomments.aspx?PostID=1003</wfw:commentRss><comments>http://blog.aspnet.sk/duracellko/archive/2007/12/13/ado-net-entity-framework-beta-3.aspx#comments</comments><description>&lt;p&gt;Asi ste si všimli, že serial o LINQ sa&amp;nbsp;akosi zastavil. Pokračovaním by malo byť využitie LINQ na prístup k relačným databázam. Pre tento účel vyvýja Microsoft až dva frameworky LINQ 2 SQL a ADO.NET Entity Framework. Toto rozdvojenie sa mi nezdá šťastný krok, ale to už asi neovplyvním. LINQ 2 SQL je súčasťou .NET 3.5, to znamená že v dnešnej dobe existuje finálna verzia. Predpokladáte správne, že oproti ADO.NET Entity Framework má oveľa slabšie možnosti mapovania. ADO.NET Entity Framework je ešte stále vo vývoji a nedávno vyšla verzia Beta 3. Asi najpodstatnejšia feature, ktorá pribudla je, že existujúci model sa dá obnoviť z databázy. To bol aj dôvod zastavenia seriálu o LINQ. Rozhodol som sa, že nebudem písať o LINQ 2 SQL, ale prejdem rovno na ADO.NET EF. Lenže Beta 2 nebola prakticky použiteľná. Teda hlavne myslím Add-In do Visual Studio 2008. Občas to padalo. Ale hlavne, ak som z databázy vytvoril model, tak to fungovalo. Ale problém nastal, ak som niečo zmenil v databáze. Nástroj už neumožňoval obnovenie modelu z databázy.&amp;nbsp;Jediná možnosť bola priamo editovať XML súbor s definíciou modelu. Keďže sa zdá, že verzia Beta 3 je celkom použiteľná, tak sa vynasnažím čo najskôr pokračovať v tomto seriáli. Ale žiaľ asi až po sviatkoch.&lt;/p&gt;
&lt;p&gt;No a teraz k inštaláci ADO.NET EF. Je potrebné nainštalovať dve časti.&lt;/p&gt;
&lt;p&gt;ADO.NET Entity Framework Runtime Beta 3: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=15DB9989-1621-444D-9B18-D1A04A21B519"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=15DB9989-1621-444D-9B18-D1A04A21B519&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ADO.NET Entity Framework Tools December CTP: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=D8AE4404-8E05-41FC-94C8-C73D9E238F82"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=D8AE4404-8E05-41FC-94C8-C73D9E238F82&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Avšak pred inštaláciou nástrojov je potrebné nainštalovať aj nejaký &lt;a class="" href="http://go.microsoft.com/fwlink/?LinkID=104985"&gt;XML Editor QFE&lt;/a&gt;. Je to nejaký patch na Visual Studio 2008 vedený pod KB945282. Jediné čo som o tomto KB našiel na jednom blogu je, že to je tak nový patch, že ešte k nemu ani neexistuje článok v databáze KB. No je to celkom zaujímavé, že VS 2008 nie je vonku ani mesiac a už k nemu existuje záplata.&lt;/p&gt;
&lt;!-- AddThis Button BEGIN --&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;var addthis_pub="spigi";&lt;/script&gt;&lt;a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', 'http://blog.aspnet.sk/duracellko/archive/2007/12/13/ado-net-entity-framework-beta-3.aspx', 'ADO.NET Entity Framework Beta 3')" onmouseout="addthis_close()" onclick="return addthis_sendto()"&gt;&lt;img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/&gt;&lt;/a&gt;&lt;script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;!-- AddThis Button END --&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=1003" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/ADO.NET+Entity+Framework/default.aspx">ADO.NET Entity Framework</category></item><item><title>LINQ part 3 - LINQ nad IEnumerable</title><link>http://blog.aspnet.sk/duracellko/archive/2007/11/08/linq-part-3-linq-nad-ienumerable.aspx</link><pubDate>Thu, 08 Nov 2007 19:50:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:628</guid><dc:creator>duracellko</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/duracellko/rsscomments.aspx?PostID=628</wfw:commentRss><comments>http://blog.aspnet.sk/duracellko/archive/2007/11/08/linq-part-3-linq-nad-ienumerable.aspx#comments</comments><description>&lt;p&gt;Ďalší diel seríalu o LINQ. Predchádzajúce diely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="" href="http://blog.aspnet.sk/duracellko/archive/2007/10/31/linq-part-1-nov-233-prvky-v-c.aspx"&gt;&lt;font color="#666666"&gt;LINQ part 1 - Nové prvky v C#&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="" href="http://blog.aspnet.sk/duracellko/archive/2007/11/02/linq-part-2-ienumerable-a-iqueryable.aspx"&gt;LINQ part 2 - IEnumerable a IQueryable&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;Language Integrated Query&lt;/span&gt; je rozšírenie jazyka pre podporu operácií spomínaných v&amp;nbsp;predchádzajúcom diely. Tieto rozšírenia sa týkajú jazyka C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt; aj&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;Visual Basic. To znamená, že do jazyka pribudli konštrukcie napodobňujúce syntax SQL. Tieto špeciálne príkazy sa ale nakoniec vždy preložia ako operácie nad množinami. Pokiaľ pracujeme s&amp;nbsp;objektom IEnumerable, tak sa LINQ príkazy preložia ako volania rozširujúcich metód nad IEnumerable. Pokiaľ pracujeme s&amp;nbsp;IQueryable, tak sa LINQ príkazy preložia do konštrukcie Expression objektu. To znamená, že všetko, čo môžeme zapísať pomocou LINQ vieme zapísať aj pomocou klasických volaní metód. Avšak použitie LINQ je väčšinou prehľadnejšie. V&amp;nbsp;tomto diely ukážem viac príkladov a&amp;nbsp;operácii ako v&amp;nbsp;predchádzajúcom, ale všetky tieto príklady sa dajú napísať aj bez použitia LINQ. Môžete si to vyskúšať.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Však poďme sa pozrieť na jednotlivé príkazy. Ako som povedal, tak syntax LINQ sa snaží napodobňovať jazyk SQL. Pravdepodobne preto, že oba jazyky majú rovnaký cieľ a&amp;nbsp;jazyk SQL pozná každý, kto serióznejšie programoval. Takže základom každého LINQ výrazu sú slová &lt;b style="mso-bidi-font-weight:normal;"&gt;from&lt;/b&gt; a&amp;nbsp;&lt;b style="mso-bidi-font-weight:normal;"&gt;select&lt;/b&gt;. Teda select môže byť nahradený slovom group, ale o&amp;nbsp;tom neskôr. Najlepšie je to ukázať na príklade.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from c in Customers select c.Name;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Každý LINQ výraz začína operátorom &lt;b style="mso-bidi-font-weight:normal;"&gt;from&lt;/b&gt;, ktorý vracia objekt typu IEnumerable alebo IQueryable. Za týmto operátorom nasleduje konštrukcia známa z&amp;nbsp;príkazu foreach. Teda &lt;i style="mso-bidi-font-style:normal;"&gt;iterujúca premenná&lt;/i&gt; in &lt;i style="mso-bidi-font-style:normal;"&gt;kolekcia&lt;/i&gt;. Iterujúcu premennú definujeme len pre to, aby sme sa v&amp;nbsp;ďalších častiach mohli na ňu odkazovať. Je to niečo podobné ako alias tabuľky v&amp;nbsp;SQL.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Select&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operátor &lt;b style="mso-bidi-font-weight:normal;"&gt;select&lt;/b&gt; slúži na projekciu. To znamená, že transformuje prvky pôvodnej kolekcie na nové prvky. V&amp;nbsp;predchádzajúcom príklade nám vráti kolekciu mien zákazníkov. Operátor select je najjednoduchší operátor LINQ. Určuje vlastne pravú stranu lambda výrazu pri projekcii. Takže okrem mena tam môže byť nový anonymný objekt, ktorý má vlastnosti Id a&amp;nbsp;Name. Alebo to môže byť samotná iterujúca premenná. To má samozrejme skôr zmysel pri spojení so selekciou, teda &lt;b style="mso-bidi-font-weight:normal;"&gt;where&lt;/b&gt;. V&amp;nbsp;tomto prípade by časť select ani nemusela byť v&amp;nbsp;LINQ výraze, ale táto časť je povinná.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Asi ste si všimli rozdiel medzi SQL a&amp;nbsp;LINQ. V&amp;nbsp;LINQ je prvý operátor from a&amp;nbsp;select je posledný. Dôvod je jednoduchý. V&amp;nbsp;časti from zadefinujete iterujúcu premennú a&amp;nbsp;v&amp;nbsp;časti select (prípadne v&amp;nbsp;ďalších častiach) túto premennú používame s&amp;nbsp;plnou podporou Intellisense. Nakoniec ja keď píšem SQL príkaz, tak najprv napíšem časť FROM, pretože si tam zadefinujem tabuľky a&amp;nbsp;aliasy, a&amp;nbsp;potom napíšem časť SELECT. Autori SQL sa pre toto trochu divné (aj keď dnes zažité) poradie rozhodli preto, že celý príkaz potom vyzerá ako rozkazovacia veta. Práve preto podľa mňa autori LINQ mohli upustiť od slovíčok from a&amp;nbsp;select a&amp;nbsp;mohli ich nahradiť inými, prípadne nejakými konštrukciami špeciálnych znakov. Ja osobne by som si vedel časť from predstaviť uzatvorenú do hranatých zátvoriek. Ale asi marketingoví špecialisti sa rozhodli, že to musí čo najviac pripomínať SQL, aby programátori mali pocit, že to vlastne už dávno ovládajú.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;From&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Už sme si ukázali, ako pomocou from vybrať prvky z&amp;nbsp;jednej kolekcie. Ďalšia možná operácia je kartézky súčin. Dosť nezmyselný, ale názorný príklad.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list2 = from c1 in Customers &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;from c2 in Customers &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select new { Name1 = c1.Name, Name2 = c2.Name };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Na rozdiel od SQL sa tu nepoužíva čiarka alebo CROSS JOIN, ale druhé &lt;b style="mso-bidi-font-weight:normal;"&gt;from&lt;/b&gt;. Niekde na nete som videl aj príklady, kde bola použitá čiarka, ale to asi bolo ešte za čias Beta 1, pretože mne to v&amp;nbsp;Beta 2 funguje len s&amp;nbsp;from. Nakoniec druhý operátor from dokáže viac ako kartézky súčin. A&amp;nbsp;je to vidieť na nasledovnom príklade.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list3 = from o in Orders&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;from ol in o.Lines&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;select ol;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Tento príklad vylistuje všetky riadky vo všetkých objednávkach. Tu je teda možné vidieť, čo from operátor presne robí. Spraví zjednotenie kolekcií, pričom zoznam kolekcií je definovaný prvým from. Dokonca medzi dve from časti je možné vložiť napríklad where alebo order by časť. Síce ešte som nespomínal where časť, ale predpokladám že ju poznáte z&amp;nbsp;SQL.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;A&amp;nbsp;teraz si zoberme dva veľmi podobné príklady.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Príklad 1:&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var list4 = from o in Orders&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;where o.Id == 1&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;from ol in o.Lines&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select ol;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Príklad 2:&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var list5 = from o in Orders&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;from ol in o.Lines&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;where o.Id == 1&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select ol;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;V obidvoch príkladoch výrazy vrátia ten istý výsledok. Rozdiel je ale v&amp;nbsp;spôsobe výpočtu. V&amp;nbsp;prvom prípade sa prechádza kolekcia objednávok, pričom sa berú do úvahy len prvky, kde Id = 1. A len&amp;nbsp;pre tieto prvky sa prechádzajú kolekcie riadkov. Čiže výpočet prebieha optimálne tak, ako by ho každý (alebo väčšina) programátor napísal. V&amp;nbsp;druhom príklade sa ale prechádzajú všetky objednávky a&amp;nbsp;všetky riadky. A&amp;nbsp;až potom sa kontroluje, či Id = 1. Čiže výpočet nie je optimálny.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Druhý rozdiel je v&amp;nbsp;tom, že v&amp;nbsp;druhom príklade sa vytvára anonymný typ, aj keď ho nepotrebujeme. Druhé from sa prekladá ako metóda &lt;b style="mso-bidi-font-weight:normal;"&gt;SelectMany&lt;/b&gt;. V&amp;nbsp;prvom príklade je za druhým from len select časť. To znamená, že táto časť je zároveň pravou stranou lambda výrazu, ktorý je argument funkcie &lt;b style="mso-bidi-font-weight:normal;"&gt;SelectMany&lt;/b&gt;. A&amp;nbsp;keďže sa vyberá priamo objekt typu OrderLine, tak nie je potrebné vytvoriť anonymný typ. V&amp;nbsp;druhom príklade SelectMany vracia kolekciu nasledovných anonymných objektov:&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;new { o, ol }&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nakoniec sa z&amp;nbsp;týchto anonymných objektov vyberú len tie, kde o.Id = 1, a&amp;nbsp;do výsledku ide len ol.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Tu je teda vidieť rozdiel medzi SQL a&amp;nbsp;LINQ nad IEnumerable. SQL je skutočne deklaratívny jazyk, kde sa príkaz najprv z&amp;nbsp;optimalizuje a&amp;nbsp;až potom vyhodnocuje. Takže rovnaký výsledok sa vypočíta rovnakým spôsobom, bez ohľadu na to, ako príkaz napíšeme. Teda aspoň väčšinou databázové servery zvládajú. LINQ nad IEnumerable sa vyhodnocuje iteratívne, a&amp;nbsp;preto je potrebné si dávať pozor na to, ako LINQ výraz napíšeme. Práve preto som v&amp;nbsp;predchádzajúcom diely písal funkciách, ktoré sa volajú na pozadí LINQ, aby si každý programátor uvedomil, čo sa deje, a&amp;nbsp;či kód píše správne. Prípadne, ak je výkon aplikácie skutočne dôležitý, tak je asi vhodné LINQ úplne vynechať a&amp;nbsp;mať algoritmy pod kontrolou.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Samozrejme toto sa netýka LINQ nad IQueryable. Pretože v&amp;nbsp;tomto prípade výpočet neprebieha v&amp;nbsp;.NET, ale sa vyskladá Expression, ktorá sa pošle zdroju. A&amp;nbsp;či ju zdroj výpočet optimalizuje alebo nie, tak to zo C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt; neovplyvníme. Ale asi najčastejšie zdroj bude relačná databáza, takže výpočet sa väčšinou optimalizuje.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Where&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operátor &lt;b style="mso-bidi-font-weight:normal;"&gt;where&lt;/b&gt; je veľmi jednoduchý operátor na selekciu. Za týmto operátorom nasleduje predikát, teda výraz s&amp;nbsp;výsledkom typu boolean. No a&amp;nbsp;výsledok operácie je kolekcia prvkov, ktoré spĺňajú danú podmienku.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad vyberie objednávky, ktoré majú viac ako jednu položku.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from o in Orders&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;where o.Lines.Count &amp;gt; 1&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select o;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Order By&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operátor &lt;b style="mso-bidi-font-weight:normal;"&gt;orderby&lt;/b&gt; slúži na triedenie prvkov v&amp;nbsp;kolekcii. Za operátorom nasleduje zoznam kľúčov, podľa ktorých sa má triediť. Kľúč je výraz, ktorého výsledkom je typ implementujúci rozhranie IComparable. Porovnanie je potrebné práve kvôli tomu, že sa využíva pri triedení. Jednotlivé kľúče sú oddelené čiarkou. Za každým kľúčom je možné určiť &lt;b style="mso-bidi-font-weight:normal;"&gt;ascending&lt;/b&gt; alebo &lt;b style="mso-bidi-font-weight:normal;"&gt;descending&lt;/b&gt;. Samozrejme, že ak nič neuvedieme, tak sa triedi vzostupne.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad zotriedi zákazníkov podľa mena, ale dopredu dá VIP zákazníkov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from c in Customers&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;orderby c.VIP descending, c.Name&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select c;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Group By&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operátor &lt;b style="mso-bidi-font-weight:normal;"&gt;group&lt;/b&gt; je opak funkcie SelectMany, čiže druhého from. Je to jediný operátor, ktorý môže byť na konci výrazu namiesto operátora select. Výsledkom operácie je kolekcia prvkov typu &lt;b style="mso-bidi-font-weight:normal;"&gt;IGrouping&lt;/b&gt;. Rozhranie IGrouping je odvodené od IEnumerable a&amp;nbsp;na viac má vlastnosť &lt;b style="mso-bidi-font-weight:normal;"&gt;Key&lt;/b&gt;. Jeden IGrouping prvok teda predstavuje kolekciu prvkov s&amp;nbsp;rovnakým kľúčom.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operátor group má dva operandy oddelené slovom &lt;b style="mso-bidi-font-weight:normal;"&gt;by&lt;/b&gt;. Prvý operand je výraz, ktorý transformuje zdrojový prvok na výsledný podobne ako select. Druhý operand je výraz, ktorý vyberá kľúč, podľa ktorého sa má výsledok zoskupiť.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad zoskupí zákazníkov podľa toho, čí sú VIP alebo nie.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from c in Customers group c by c.VIP;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;foreach (var vip in list1)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;VIP: {0}&amp;quot;, vip.Key);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;vip.Print(i =&amp;gt; i.Name);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Väčšinou prvý operand nerobí žiadnu transformáciu, len vráti prvok pôvodnej kolekcie. Ale nemusí to byť vždy pravda. Nasledovný príklad zoskupí ceny položiek objednávok podľa produktov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var orderLines = from o in Orders from ol in o.Lines select ol;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;Console.WriteLine(&amp;quot;Group by product&amp;quot;);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list2 = from ol in orderLines&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;group ol.Price by ol.Product;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;foreach (var product in list2)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(product.Key);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;product.Print(i =&amp;gt; i.ToString());&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operátor group má voliteľnú časť &lt;b style="mso-bidi-font-weight:normal;"&gt;into&lt;/b&gt;. Táto časť slúži na to, aby sme s&amp;nbsp;výsledkom operácie mohli ďalej pracovať. Napríklad triediť alebo selektovať. Nasledovný príklad nám navyše zoskupené produkty utriedi podľa názvu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list3 = from ol in orderLines&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;group ol.Price by ol.Product into p&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;orderby p.Key&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select p;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Toto je zase názorný príklad kedy záleží na poradí operácií. Ak by sme triedili kolekciu pred zoskupovaním, tak by sme triedili kolekciu, ktorá má v&amp;nbsp;mojom príklade asi 20 prvkov. Avšak, keďže sme triedili až po zoskupení, tak triedime len kolekciu skupín (teda produktov), ktorá má v&amp;nbsp;mojom príklade len 5 prvkov. Takže triedenie je menej náročné.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Join&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operácia join je známa z&amp;nbsp;relačných databáz. V&amp;nbsp;objektovom programovaní však nemá veľký význam, pretože objekty sú viazané pomocou vlastností. Takže asociovaný objekt je prístupný cez vlastnosť a&amp;nbsp;nie je potrebné definovať väzbu. Napríklad nasledovný príklad vylistuje všetky objednávky a&amp;nbsp;ich naviazaných zákazníkov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from o in Orders select new { o.Id, o.Customer.Name };&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Avšak môže sa stať, že potrebujeme spojiť dva zoznamy, medzi ktorými nie je priama asociácia, ale objekty sa dajú pospájať pomocou zhodných kľúčov. Tak ako v&amp;nbsp;relačnej databáze aj v&amp;nbsp;LINQ je &lt;b style="mso-bidi-font-weight:normal;"&gt;join&lt;/b&gt; binárny operátor nad dvoma zoznamami. Jeden zoznam je definovaný na ľavo od operátora join a&amp;nbsp;druhý na pravo. Potom nasleduje slovo &lt;b style="mso-bidi-font-weight:normal;"&gt;on&lt;/b&gt; a&amp;nbsp;za ním kľúče oboch zoznamov, ktoré sa majú zhodovať. Kľúče sú oddelené slovom &lt;b style="mso-bidi-font-weight:normal;"&gt;equals&lt;/b&gt;. Taktiež za slovom on, nemôže nasledovať ľubovoľná podmienka, tak ako v&amp;nbsp;SQL, ale len porovnanie dvoch kľúčov na zhodu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad spojí riadky objednávky s&amp;nbsp;produktmi.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from ol in lastOrder.Lines&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;join p in Products on ol.Product equals p.Name&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select new { ol.Product, p.Category, ol.Price };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Pokiaľ za operátorom join nasleduje niečo iné ako select, tak výsledkom operácie je kolekcia prvkov anonymného typu. Každý prvok reprezentuje dvojicu prvkov z&amp;nbsp;oboch zoznamov, ktoré majú rovnaký kľúč. Avšak v&amp;nbsp;LINQ výraze nevidíme tento anonymný typ, ale sú prístupne priamo iterujúce premenné z&amp;nbsp;oboch zoznamov. Nasledovný príklad ukazuje použitie selekcie za joinom.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list2 = from o in Orders&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;from ol in o.Lines&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;join p in Products on ol.Product equals p.Name&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;where p.Category == &amp;quot;Processor&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select new { ol.Product, p.Category, ol.Price };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Na pravo od join nie je kolekcia definovaná slovom from, ale priamo iterujúcou premennou a&amp;nbsp;kolekciou. To však neznamená, že kolekcia na pravo musí byť dopredu zadefinovaná. V&amp;nbsp;podstate za slovom in môže nasledovať v&amp;nbsp;zátvorkách ďalší LINQ výraz. Ukazuje to nasledovný príklad, ktorý vráti rovnaký výsledok ako predchádzajúci príklad.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list3 = from o in Orders&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;from ol in o.Lines&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;join p in (from prod in Products&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;where prod.Category == &amp;quot;Processor&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select prod)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;on ol.Product equals p.Name&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select new { ol.Product, p.Category, ol.Price };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Operácia join sa dá použiť aj na kolekcie, ktoré nemajú unikátny kľúč. Nasledovný príklad spája zákazníka s&amp;nbsp;kategóriou cez VIP atribút. V&amp;nbsp;tomto prípade sú VIP zákazníci vylistovaný viackrát, pretože existujú dve VIP kategórie.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from c in Customers&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;join cc in CustomerCategories on c.VIP equals cc.Vip&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;select new { c.Name, cc.Category };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Všetky doterajšie operácie join boli typu INNER JOIN. To znamená, že sa vylistovali iba tie prvky z&amp;nbsp;prvého zoznamu, pre ktoré existuje spárovaný prvok z&amp;nbsp;druhého zoznamu, a&amp;nbsp;naopak. LINQ podporuje join operáciu so zoskupovaním. Výsledkom operácie je zoznam prevej kolekcie, ale ku každému prvku je možné pridať vlastnosť, ktorá obsahuje kolekciu spárovaných prvkov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad vylistuje zoznam zákazníkov a&amp;nbsp;pre každého zákazníka vylistuje zoznam priradených kategórií.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list2 = from c in Customers&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;join cc in CustomerCategories on c.VIP equals cc.Vip into cat&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select new { c.Name, cat };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Je tu pridaná časť &lt;b style="mso-bidi-font-weight:normal;"&gt;into&lt;/b&gt; &lt;i style="mso-bidi-font-style:normal;"&gt;premenná&lt;/i&gt;. Práve táto premenná obsahuje kolekciu spárovaných prvkov (v tomto prípade kategórií). Keďže je prístupná celá kolekcia, tak nie je prístupná iterujúca premenná na&amp;nbsp;pravo od join. Táto iterujúca premenná sa dá použiť iba za equals.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Mne osobne tento zoskupujúci join nepripadá veľmi využiteľný. Hlavne preto, že sa zoskupuje podľa prvkov druhej kolekcie. Na jednej strane je pekné, že to vlastne vracia prvú kolekciu (rozšírenú o&amp;nbsp;podkolekcie). Na druhej strane normálna požiadavka „zoznam zákazníkov zoskupených podľa kategórie“, by sa mala transformovať na príkaz „from c in customers...“ a&amp;nbsp;nie začínať výberom kategórie tak, ako nás to núti tento join. Nakoniec, keby kategória bola nejaká vlastnosť objektu zákazník, tak príkaz začína výberom zákazníkov a&amp;nbsp;potom ich zoskupíme pomocou groupby.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Ale ako som spomínal, tak táto forma joinu sa dá využiť na LEFT JOIN, pretože ak ku zákazníkovi neexistuje žiadna kategória, tak sa mu priradí prázdna kolekcia kategórií. V&amp;nbsp;tomto prípade je zase výber z&amp;nbsp;druhej kolekcie do premennej into úplne na mieste.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Príkaz Let&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Príkaz &lt;b style="mso-bidi-font-weight:normal;"&gt;let&lt;/b&gt; slúži na to, aby sme si v&amp;nbsp;rámci iterácie uložili niečo do premennej. Typický neduh jazyka SQL je napríklad, ak máme SELECT, kde je nejaký vypočítavaný stĺpec. A&amp;nbsp;keď máme tento stĺpec aj v&amp;nbsp;podmienke a&amp;nbsp;chceme podľa neho aj triediť, tak ten vzorec musíme vypísať 3-krát. Našťastie dobrý databázový stroj to optimalizuje a&amp;nbsp;vzorec vypočíta len raz a&amp;nbsp;potom výsledok použije pri podmienke, triedení aj vo výsledku. Problém je ale v&amp;nbsp;tom, že to musíme písať 3-krát a&amp;nbsp;hlavne keď sa vzorec zmení, tak si musíme dávať pozor na to, aby sme to 3-krát zmenili. No a&amp;nbsp;ako sme spomínali, tak LINQ nad IEnumerable neoptimalizuje výpočet, takže v&amp;nbsp;tomto prípade sa vzorec naozaj bude aj 3-krát počítať.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad zobrazuje priezviská zákazníkov a&amp;nbsp;zároveň ich zotriedi.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var list1 = from c in Customers&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;let lastName = c.Name.Split(&amp;#39; &amp;#39;)[1]&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;orderby lastName&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;select new { lastName, c.VIP };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;To sú teda všetky príkazy rozšírenia LINQ pre C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt;. Ako som spomínal, tak všetky príkazy sa dajú nahradiť použitím rozširujúcich metód rozhrania IEnumerable, pomocou ktorých sa dá dosiahnúť dokonca oveľa viac. Rovnako funguje LINQ aj nad rozhraním IQueryable.&lt;/font&gt;&lt;/p&gt;
&lt;p style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:6px;BORDER-TOP:gray 1px solid;PADDING-LEFT:6px;PADDING-BOTTOM:6px;BORDER-LEFT:gray 1px solid;PADDING-TOP:6px;BORDER-BOTTOM:gray 1px solid;"&gt;&lt;strong&gt;Stiahnúť&lt;/strong&gt;: &lt;a href="http://blog.aspnet.sk/blogs/duracellko/LINQ/TestApp3.zip"&gt;Zdrojový kód&lt;/a&gt;&lt;/p&gt;
&lt;!-- AddThis Button BEGIN --&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;var addthis_pub="spigi";&lt;/script&gt;&lt;a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', 'http://blog.aspnet.sk/duracellko/archive/2007/11/08/linq-part-3-linq-nad-ienumerable.aspx', 'LINQ part 3 - LINQ nad IEnumerable')" onmouseout="addthis_close()" onclick="return addthis_sendto()"&gt;&lt;img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/&gt;&lt;/a&gt;&lt;script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;!-- AddThis Button END --&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=628" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/C_2300_+3.5/default.aspx">C# 3.5</category></item><item><title>LINQ part 2 - IEnumerable a IQueryable</title><link>http://blog.aspnet.sk/duracellko/archive/2007/11/02/linq-part-2-ienumerable-a-iqueryable.aspx</link><pubDate>Fri, 02 Nov 2007 09:07:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:509</guid><dc:creator>duracellko</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/duracellko/rsscomments.aspx?PostID=509</wfw:commentRss><comments>http://blog.aspnet.sk/duracellko/archive/2007/11/02/linq-part-2-ienumerable-a-iqueryable.aspx#comments</comments><description>&lt;p&gt;Ďalší diel seríalu o LINQ. Predchádzajúce diely:&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://blog.aspnet.sk/duracellko/archive/2007/10/31/linq-part-1-nov-233-prvky-v-c.aspx"&gt;LINQ part 1 - Nové prvky v C#&lt;/a&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#365f91" size="5"&gt;Rozšírenia IEnumerable&lt;/font&gt;&lt;/h1&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;V .NET 3.5 pribudla assembly System.Core, ktorá obsahuje statickú triedu Enumerable. Táto trieda obsahuje rozširujúce metódy, ktoré rozširujú interface IEnumerable. Sú tu funkcie na projekciu, selekciu, agregáciu a&amp;nbsp;triedenie na IEnumerable.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Selekcia&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Selekcia je operácia, pri ktorej sa vyberie podmnožina prvkov pôvodnej množiny. Na toto slúži funkcia &lt;b style="mso-bidi-font-weight:normal;"&gt;Where&lt;/b&gt;, ktorá má jediný parameter. Tento parameter je funkcia, ktorá zoberie prvok a&amp;nbsp;vráti true, ak sa má dostať do výberu, inak false.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje selekciu všetkých VIP zákazníkov. Je tu možné vidieť efektívne použitie Lambda funkcie.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var vipCustomers = Customers.Where(c =&amp;gt; c.VIP);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje použitie porovnania.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var newOrders = Orders.Where(o =&amp;gt; o.Id &amp;gt;= 3);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje použitie referencovaných objektov. Vyberie len objednávky od VIP zákazníkov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var vipOrders = Orders.Where(o =&amp;gt; o.Customer.VIP);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje zloženú podmienku. Vyberie nové objednávky od VIP zákazníkov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var newVipOrders = Orders.Where(o =&amp;gt; o.Id &amp;gt;= 3 &amp;amp;&amp;amp; o.Customer.VIP);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje použitie funkcie vo Where. Vyberú sa objednávky, ktoré obsahujú produkt od ATI.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var atiOrders = Orders.Where(o =&amp;gt; o.Lines.Exists(ol =&amp;gt; ol.Product.Contains(&amp;quot;ATI&amp;quot;)));&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Projekcia&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Projekcia je operácia, pri ktorej sa všetky prvky množiny transformujú na iné prvky. Napríklad v&amp;nbsp;SQL sa pod projekciou chápe vybratie len konkrétnych stĺpcov zo všetkých možných. Na projekciu slúži funkcia Select, ktorá ma jeden parameter. Tento parameter je funkcia, ktorá konvertuje starý prvok na nový.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad skonvertuje množinu zákazníkov na množinu mien.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var customerNames = Customers.Select(c =&amp;gt; c.Name);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Pri projekcii je výhodné použiť anonymné triedy, kde jednotlivé vlastnosti reprezentujú vypraté stĺpce. Nasledovný príklad vytvorí kolekciu riadkov, ktoré obsahujú číslo objednávky, názov zákazníka, počet riadkov.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var orderDetails = Orders.Select(o =&amp;gt; new { o.Id, o.Customer.Name, LinesCount = o.Lines.Count });&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Funkcia Select sa dá použiť aj na zmenu vlastností objektov v&amp;nbsp;kolekcii. Nasledovný príklad zväčší ID objednávok o&amp;nbsp;1 a&amp;nbsp;vráti kolekciu nových ID.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;Change IDs&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;Original IDs&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;foreach (var i in Orders.Select(o =&amp;gt; o.Id))&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(i);&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var newIds = Orders.Select(o =&amp;gt; o.Id += 1);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;First update&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;foreach (var i in newIds)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(i);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;Second update&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;foreach (var i in newIds)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(i);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Tento príklad zároveň ukazuje, ako fungujú rozšírenia nad IEnumerable. Keď tento kód spustíte, tak sa vždy vypíše iná množina IDčiek. To znamená, že nová kolekcia sa nevytvorí pri volaní funkcie Select, ale až pri samotnom prechádzaní prvkami kolekcie, teda pri &lt;b style="mso-bidi-font-weight:normal;"&gt;foreach&lt;/b&gt;. Preto sa IDčka objednávok zmenia dvakrát.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Ďalšia zaujímavá funkcia je &lt;b style="mso-bidi-font-weight:normal;"&gt;SelectMany&lt;/b&gt;. Táto funkcia slúži na výber z&amp;nbsp;podkolekcií. Napríklad máme zoznam objednávok a&amp;nbsp;každá objednávka obsahuje zoznam riadkov objednávky. Ak chceme vybrať všetky riadky zo všetkých objednávok, tak môžeme použiť funkciu SelectMany. Nasledovný príklad vyberie zo všetkých riadkov objednávok ID objednávky, názov produktu a&amp;nbsp;cenu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var lines = Orders.SelectMany(o =&amp;gt; o.Lines, (o, ol) =&amp;gt; new { o.Id, ol.Product, ol.TotalPrice });&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Triedenie&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Triedenie je užitočné, ak potrebujeme prechádzať prvky v&amp;nbsp;určitom poradí. Na to slúžia funkcie &lt;b style="mso-bidi-font-weight:normal;"&gt;OrderBy&lt;/b&gt; a&amp;nbsp;&lt;b style="mso-bidi-font-weight:normal;"&gt;OrderByDescending&lt;/b&gt;. Obidve fungujú rovnako, len tá druha triedi v&amp;nbsp;opačnom poradí. Samozrejme, že parametrom funkcie je funkcia. Táto funkcia konvertuje prvok kolekcie na kľúč, podľa ktorého sa má triediť. Voliteľný parameter je IComparer objekt, ktorý dokáže porovnávať kľúče.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad zotriedi zákazníkov podľa mena.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var orderedCustomers = Customers.OrderBy(c =&amp;gt; c.Name);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Agregácia&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Agregácia vytvorí jeden nový prvok na základe množiny prvkov. Príkladom agregácie sú suma, priemer, minimum alebo maximum. Na toto slúžia funkcie &lt;b style="mso-bidi-font-weight:normal;"&gt;Sum&lt;/b&gt;, &lt;b style="mso-bidi-font-weight:normal;"&gt;Average&lt;/b&gt;, &lt;b style="mso-bidi-font-weight:normal;"&gt;Min&lt;/b&gt; a&amp;nbsp;&lt;b style="mso-bidi-font-weight:normal;"&gt;Max&lt;/b&gt;. Ako parameter sa odovzdá funkcia, ktorá skonvertuje prvok na číslo. Pri Min a&amp;nbsp;Max je povolena aj konverzia na IComparable.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad vypočíta celkovú sumu poslednej objednávky.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var priceSum = Orders[5].Lines.Sum(ol =&amp;gt; ol.TotalPrice);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Je možné vykonať aj vlastné agregácie pomocou funkcie &lt;b style="mso-bidi-font-weight:normal;"&gt;Aggregate&lt;/b&gt;. Táto funkcia bola spomenutá v&amp;nbsp;predchádzajúcej kapitole.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Iné zaujímavé rozšírenia&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Ako sme si povedali, tak selekcie, projekcie a&amp;nbsp;všetko ostatné sa vyhodnocuje pri každom prechádzaní kolekcie. To môže byť problém, ak je výpočet zložitý a&amp;nbsp;potrebujeme kolekciu prechádzať viackrát. Práve tu nám pomôže funkcia &lt;b style="mso-bidi-font-weight:normal;"&gt;ToList&lt;/b&gt;. Táto funkcia spustí výpočet a&amp;nbsp;uloží výsledok do zoznamu. Takže pri prechádzaní prvkov v&amp;nbsp;tomto zozname sa nespustí výpočet, ale použije sa uložená kolekcia.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Teraz modifikujme príklad z&amp;nbsp;projekcie a&amp;nbsp;vložme tam funkciu ToList. Môžeme vidieť, že IDčka sa zmenili len raz.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;Change IDs&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;Original IDs&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;foreach (var i in Orders.Select(o =&amp;gt; o.Id))&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(i);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var newIds = Orders.Select(o =&amp;gt; o.Id += 1).ToList();&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;First update&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;foreach (var i in newIds)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(i);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(&amp;quot;Second update&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;foreach (var i in newIds)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(i);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Ďalšie zaujímavé funkcie sú:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;First&lt;/b&gt; – vráti prvý prvok z&amp;nbsp;kolekcie.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Last &lt;/b&gt;– vráti posledný prvok z&amp;nbsp;kolekcie.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Union &lt;/b&gt;– vráti zjednotenie dvoch kolekcií.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Intersect &lt;/b&gt;– prienik dvoch kolekcií.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Concat &lt;/b&gt;– spojí dve kolekcie za sebou.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Except &lt;/b&gt;– rozdiel dvoch kolekcií.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;All &lt;/b&gt;– vráti true, ak je podmienka splnená pre všetky prvky.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="MARGIN:0cm 0cm 0pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Any &lt;/b&gt;– vráti true, ak je podmienka splnená pre aspoň jeden prvok.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="MARGIN:0cm 0cm 10pt 36pt;TEXT-INDENT:-18pt;mso-list:l1 level1 lfo1;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;ToDictionary &lt;/b&gt;– skonvertuje kolekciu na slovník, pričom sa zadá funkcia, ktorá vyberá kľúč z&amp;nbsp;prvku.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#365f91" size="5"&gt;IQueryable&lt;/font&gt;&lt;/h1&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;.NET 3.5 nám ponúka veľmi slušné operácie nad objektmi typu IEnumerable. Sú tu implementované štandardné operácie ako zjednotenie, prienik, selekcia, projekcia, join, agregácie, zoskupovanie, triedenie a&amp;nbsp;iné, teda všetky operácie relačnej algebry. Všetky tieto operácie sú implementované a&amp;nbsp;na ich použitie je potrebné len doplniť príslušné predikátové alebo transformačné funkcie. Tieto funkcie môžu byť ľubovoľné funkcie napísané v&amp;nbsp;nejakom .NET jazyku, ktoré majú potrebnú signatúru. V&amp;nbsp;predchádzajúcich príkladoch sme použili lambda výrazy. Ale tieto výrazy sa prekladajú ako anonymné funkcie. Rovnako môžeme použiť aj delegátov na neanonymné funkcie. Takže nakoniec operácie nad IEnumerable vždy využívajú kód preložený do MSIL. Toto ale môže byť problém, ak chceme robiť tieto operácie nad prvkami, ktoré sa nenachádzajú v&amp;nbsp;našej Application Domain. Príkladom takýchto množín môže byť SQL databáza, OLAP databáza, web service, vyhľadávací stroj a&amp;nbsp;podobne. V&amp;nbsp;tomto prípade nie je možné na operácie využiť MSIL funkcie, ale je potrebné vytvoriť požiadavku pre externý zdroj, na základe ktorej sa nám vráti výsledok. Práve túto úlohu plní&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;interface IQueryable. IQueryable je odvodené od IEnumerable. Rozšírené je o 2 hlavné vlastnosti:&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="MARGIN:0cm 0cm 0pt 37.5pt;TEXT-INDENT:-18pt;mso-list:l0 level1 lfo2;mso-add-space:auto;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Expression&lt;/b&gt; – je objekt typu System.Linq.Expressions.Expression. Tento objekt reprezentuje operáciu, ktorú chceme vykonať nad externým zdrojom. Z&amp;nbsp;matematického hľadiska Expression reprezentuje vyhodnocovací strom. Uzly v&amp;nbsp;tomto strome sú jednotlivé operácie (napríklad sčítanie, zápor, porovnanie). Každý uzol je reprezentovaný samostatným objektom Expression (napríklad BinaryExpression, UnaryExpression, ConstatntExpression). Hraný v&amp;nbsp;tomto strome znamenajú, že výsledok z&amp;nbsp;jedného uzla sa použije ako operand v&amp;nbsp;inom uzly. Hrany sú reprezentované vlastnosťami jednotlivých typov Expression.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="MARGIN:0cm 0cm 10pt 37.5pt;TEXT-INDENT:-18pt;mso-list:l0 level1 lfo2;mso-add-space:auto;"&gt;&lt;span style="FONT-FAMILY:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;"&gt;&lt;span style="mso-list:Ignore;"&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="FONT:7pt &amp;#39;Times New Roman&amp;#39;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Provider &lt;/b&gt;– je objekt typu IQueryProvider. Tento objekt zoberie Expression a&amp;nbsp;dokáže vytvoriť požiadavku pre externý zdroj a&amp;nbsp;spustiť ju.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad vytvorí Expression, ktorá sčíta konštanty 3 a&amp;nbsp;4.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var const1 = Expression.Constant(3);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var const2 = Expression.Constant(4);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var add = Expression.AddChecked(const1, const2);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(add.ToString());&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Na obrazovku sa vypíše:&lt;/font&gt;&lt;/p&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span&gt;(3 + 4)&lt;/span&gt;&lt;span style="mso-ansi-language:SK;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt; 
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Tým že je IQueryable odvodené od IEnumerable, tak podporuje prechádzanie prvkov. To funguje tak, že vytvoríme IQueryable objekt s&amp;nbsp;nastavenou Expression. Keď začneme prechádzať prvky napríklad pomocou foreach, tak Provider vytvorí z&amp;nbsp;Expression požiadavku na zdroj a&amp;nbsp;spustí ju. Zdroj vráti nejaký výsledok. Provider ho transformuje na IEnumerator a&amp;nbsp;posunie objektu IQueryable. A&amp;nbsp;ten to vráti ako výsledok, pomocou ktorého sa prechádzajú prvky.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;IQueryable rozšírenia&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;V&amp;nbsp;statickej triede System.Linq.Queryable existujú tie isté rozšírenia ako pre IEnumerable. Teda napríklad funkcie Select, Where, Union, Sum a&amp;nbsp;podobne. Na rozdiel od rozšírení pre IEnumerable tieto funkcie nemajú na vstupe predikátové a&amp;nbsp;transformačné funkcie, ale Expression objekty. To znamená, že je možné vytvoriť nový IQueryable objekt, kde sa pridá ďalšia operácia.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:6pt;BORDER-TOP:gray 1px solid;PADDING-LEFT:6pt;PADDING-BOTTOM:6pt;MARGIN:0cm 0cm 10pt;BORDER-LEFT:gray 1px solid;PADDING-TOP:6pt;BORDER-BOTTOM:gray 1px solid;"&gt;&lt;font face="Calibri" size="3"&gt;&lt;strong&gt;Stiahnúť&lt;/strong&gt;: &lt;a href="http://blog.aspnet.sk/blogs/duracellko/LINQ/TestApp.zip"&gt;Zdrojový kód&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;!-- AddThis Button BEGIN --&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;var addthis_pub="spigi";&lt;/script&gt;&lt;a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', 'http://blog.aspnet.sk/duracellko/archive/2007/11/02/linq-part-2-ienumerable-a-iqueryable.aspx', 'LINQ part 2 - IEnumerable a IQueryable')" onmouseout="addthis_close()" onclick="return addthis_sendto()"&gt;&lt;img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/&gt;&lt;/a&gt;&lt;script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;!-- AddThis Button END --&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=509" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/C_2300_+3.5/default.aspx">C# 3.5</category></item><item><title>LINQ part 1 - Nové prvky v C#</title><link>http://blog.aspnet.sk/duracellko/archive/2007/10/31/linq-part-1-nov-233-prvky-v-c.aspx</link><pubDate>Wed, 31 Oct 2007 15:32:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:492</guid><dc:creator>duracellko</dc:creator><slash:comments>21</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.aspnet.sk/duracellko/rsscomments.aspx?PostID=492</wfw:commentRss><comments>http://blog.aspnet.sk/duracellko/archive/2007/10/31/linq-part-1-nov-233-prvky-v-c.aspx#comments</comments><description>&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Týmto chcem začať seriál o&amp;nbsp;C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt; 3.5 a&amp;nbsp;LINQ. Myslím si, že článkov, blogov o&amp;nbsp;LINQ je na webe viac než dosť (aj keď toto je možno prvý v&amp;nbsp;slovenčine), tak nebudem sa zapájať do reklamnej kampane Microsoftu a&amp;nbsp;nezačnem tu písať tutorialy na LINQ krok za krokom. Skôr ide o&amp;nbsp;to, že táto technológia sa mi celkom zapáčila a&amp;nbsp;chcem sa podeliť o&amp;nbsp;skúsenosti, ako sa s&amp;nbsp;touto technológiou hrám.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Aj práve preto príklady nemusia mať vždy reálny význam, ale môžu obsahovať triedy a&amp;nbsp;funkcie so slovom Test. &lt;/font&gt;&lt;/p&gt;
&lt;h1 style="MARGIN:24pt 0cm 0pt;"&gt;&lt;font size="5"&gt;&lt;font color="#365f91"&gt;&lt;font face="Cambria"&gt;Nové prvky v&amp;nbsp;C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h1&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;&lt;font size="4"&gt;&lt;font color="#4f81bd"&gt;&lt;font face="Cambria"&gt;Automatic properties&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Automatické vlastnosti umožňujú definovať vlastnosť rovnako jednoducho ako pole. Ak máme vlastnosť, ktorá nerobí nič iné, len číta a&amp;nbsp;nastavuje hodnotu pola, tak toto pole nemusíme definovať a&amp;nbsp;ani telo vlastnosti. Stačí iba určiť, či má byť vlastnosť len read-only, alebo nie. Takže nasledovný kód v&amp;nbsp;C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt; 2.0&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;private int id;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;public int Id&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g&lt;/span&gt;et { return id; }&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s&lt;/span&gt;et { id = value; }&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;sa dá v&amp;nbsp;C&lt;span style="mso-ansi-language:EN-US;"&gt;#&lt;/span&gt; 3.5 napísať takto:&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;public int Id { get; set; }&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Implicitné určenie typu&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Ak premennú inicializujeme priamo v&amp;nbsp;jej definícii, tak nie je potrebné určiť typ premennej. Ten sa odvodí so vzorca, ktorý premennej priradíme. Na to slúži kľúčové slovíčko &lt;b style="mso-bidi-font-weight:normal;"&gt;var&lt;/b&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var test = &amp;quot;Hello, World!&amp;quot;;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Inicializácia objektov&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Objekty sa dajú inicializovať podobným spôsobom ako polia. Čiže za volaním konštruktoru napíšeme do množinových zátvoriek priradenie vlastností.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var t = new TestData() { Id = 1, Text = &amp;quot;A&amp;quot; };&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Rovnakým spôsobom môžeme inicializovať aj kolekcie.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var l = new List&amp;lt;int&amp;gt;() { 2, 4, 8, 16, 32 };&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Extension methods&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Rozšírujúce metódy dokážu rozšíriť už existujúcu triedu alebo interface o&amp;nbsp;nové metódy. Rozširujúca metóda musí byť statická a&amp;nbsp;musí byť v&amp;nbsp;statickej triede. Musí mať minimálne jeden parameter a&amp;nbsp;jeho typ určuje, ktorú typ sa rozširuje. Tento prvý parameter musí byť označený slovom this.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Napríklad nasledovná metóda rozširuje string o&amp;nbsp;funkcie Left a Right, ktoré sú známe z&amp;nbsp;Visual Basic.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public static class StringExtension&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public static string Left(this string source, int count)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (count &amp;gt;= source.Length)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return source;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return source.Substring(0, count);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt; 
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public static string Right(this string source, int count)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (count &amp;gt;= source.Length)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;return source;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return source.Substring(source.Length - count, count);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Potom sa dajú tieto metódy použiť nasledovne.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var test = &amp;quot;Hello, World!&amp;quot;;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;for (int i = 0; i &amp;lt; 15; i++)&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Console.WriteLine(test.Left(i));&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Rozšírujúce metódy ponúka Inellisense. Vyhľadávajú sa metódy vo všetkých statických triedach v&amp;nbsp;použitých namespaceoch s&amp;nbsp;&lt;b style="mso-bidi-font-weight:normal;"&gt;using&lt;/b&gt;. Ak sú dve rozširujúce metódy s&amp;nbsp;rovnakým názvom v&amp;nbsp;dvoch rôznych triedach, tak to kompilátor označí za chybu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Rozširujúce metódy majú význam pri interfacoch. Je možné rozšíriť interface o&amp;nbsp;rôzne metódy, pričom implementačné triedy nemusia implementovať tieto metódy. Napríklad v .NET 3.5 je množstvo rozširujúcich metód pre interface &lt;b style="mso-bidi-font-weight:normal;"&gt;IEnumerable&lt;/b&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Lambda výrazy&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Lambda výraz je iný zápis anonymnej metódy. Je to výraz skladajúci sa z&amp;nbsp;ľavej a&amp;nbsp;pravej strany oddelenej &lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;=&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;.&lt;/span&gt; Ľavá strana obsahuje jeden alebo viac parametrov. Jeden parameter sa uvádza iba názvom parametru. Viac parametrov sa uzatvorí do zátvoriek a&amp;nbsp;oddeľuje čiarkou. Typ parametra sa odvodí z&amp;nbsp;typu delegáta. Ak toto nie je možné, tak sa môže typ parametra určiť aj explicitne. Pravá strana obsahuje telo anonymnej metódy. Môže to byť jednoduchý výraz, ktorý vracia nejakú hodnotu. V&amp;nbsp;tomto prípade nie je nutne použiť slovo return ani množinové zátvorky. Pri zložitejších funkciách je ale možné použiť blokovú konvenciu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Lambda výrazy si ukážeme na rozšírených metódach typu IEnumerable. Takže najprv vytvoríme nasledovný List.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var l = new List&amp;lt;TestData&amp;gt;();&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;l.Add(new TestData() { Id = 1 });&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpMiddle" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;l.Add(new TestData() { Id = -3, Text = &amp;quot;T&amp;quot; });&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;l.Add(new TestData() { Id = 9 });&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Funkcia Sum spočíta všetky prvky zoznamu, pričom ako vstupný parameter je funkcia, ktorá skonvertuje prvok zoznamu na číslo. Nasledovný príklad ukazuje lambda výraz, ktorý prvok typu TestData zmení na číslo, ktoré je vo vlastnosti Id. Toto je najjednoduchšie, ale zaroveň najelegantnejšie použitie lambda výrazu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var sum1 = l.Sum(td =&amp;gt; td.Id);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje lambda funkciu, ktorá ma zložitejšie telo s&amp;nbsp;podmienkou. Tento príklad spočíta Idčka, ak nie je nastavený Text.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var sum2 = l.Sum(td =&amp;gt; { if (td.Text == null) return td.Id; else return 0; });&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Funkcia Select vráti nový objekt typu IEnumerable, pričom ako parameter je funkcia, ktorá konvertuje staré prvky na nové. Teda nasledovný príklad skonvertuje zoznam TestData na zoznam Idčiek.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font size="3"&gt;&lt;font face="Consolas"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;var idList = l.Select(td =&amp;gt; td.Id);&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad ukazuje lambda výraz s&amp;nbsp;dvoma parametrami. Zároveň ukazuje explicitné určenie typu, aj keď to v&amp;nbsp;tomto prípade nie je nutné. Funkcia Aggregate zlúči všetky prvky zoznamu do jedného prvku, pričom sa využije funkcia, ktorá zlúči dva prvky do jedného. Nasledovný príklad spočíta absolútne hodnoty čísel.&lt;/font&gt;&lt;/p&gt;
&lt;p class="Code" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var sum3 = idList.Aggregate((int i1, int i2) =&amp;gt; Math.Abs(i1) + Math.Abs(i2));&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="MARGIN:10pt 0cm 0pt;"&gt;&lt;font face="Cambria" color="#4f81bd" size="4"&gt;Anonymné triedy&lt;/font&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Anonymné triedy sú podobne ako anonymné metódy definované pri inicializácii. To znamená, že premennej priradíme objekt, ktorého typ nie je definovany, ale na mieste určíme vlastnosti a&amp;nbsp;ich hodnoty. Vlastnosti sú len na čítanie a&amp;nbsp;žiadne iné veci trieda nemôže obsahovať. Anonymnú triedy vytvoríme pomocou slova new a&amp;nbsp;v&amp;nbsp;množinových zátvorkách zadefinujeme vlastnosti a&amp;nbsp;hodnoty rovnako ako pri inicializácii objektu.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Nasledovný príklad vytvorí anonymnú triedu s&amp;nbsp;dvoma vlastnosťami FirstName a&amp;nbsp;LastName.&lt;/font&gt;&lt;/p&gt;
&lt;p class="CodeCxSpFirst" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;var name = new { FirstName = &amp;quot;Rasto&amp;quot;, LastName = &amp;quot;Novotny&amp;quot; };&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="CodeCxSpLast" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span&gt;&lt;font face="Consolas" size="3"&gt;Console.WriteLine(&amp;quot;{0} {1}&amp;quot;, name.FirstName, name.LastName);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:6pt;BORDER-TOP:gray 1px solid;PADDING-LEFT:6pt;PADDING-BOTTOM:6pt;MARGIN:0cm 0cm 10pt;BORDER-LEFT:gray 1px solid;PADDING-TOP:6pt;BORDER-BOTTOM:gray 1px solid;"&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;&lt;strong&gt;Stiahnúť&lt;/strong&gt;: &lt;a href="http://blog.aspnet.sk/blogs/duracellko/LINQ/TestApp.zip"&gt;Zdrojový kód&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;!-- AddThis Button BEGIN --&gt;&lt;div&gt;&lt;script type="text/javascript"&gt;var addthis_pub="spigi";&lt;/script&gt;&lt;a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', 'http://blog.aspnet.sk/duracellko/archive/2007/10/31/linq-part-1-nov-233-prvky-v-c.aspx', 'LINQ part 1 - Nov&amp;#233; prvky v C#')" onmouseout="addthis_close()" onclick="return addthis_sendto()"&gt;&lt;img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/&gt;&lt;/a&gt;&lt;script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;!-- AddThis Button END --&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=492" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/duracellko/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/duracellko/archive/tags/C_2300_+3.5/default.aspx">C# 3.5</category></item></channel></rss>