{"id":26601,"date":"2020-06-17T00:00:00","date_gmt":"2020-06-16T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=26601"},"modified":"2021-01-13T09:40:02","modified_gmt":"2021-01-13T08:40:02","slug":"linq-un-linguaggio-per-domarli-tutti","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/","title":{"rendered":"LINQ: un linguaggio per domarli tutti!"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"26606\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/attachment\/2753c67c-ebae-4900-b572-9b4148ce4887-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887-1.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"2753c67c-ebae-4900-b572-9b4148ce4887-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887-1.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887-1.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-26606\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887-1.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887-1-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887-1-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Una delle peculiarit\u00e0 che contraddistingue il mondo .NET dagli altri stack tecnologici \u00e8 sicuramente LINQ, acronimo di Language INtegrated Query. Introdotto con .NET Framework 3.5 e Visual Studio 2008, \u00e8 di fatto il primo framework indipendente dall\u2019architettura e integrato all\u2019interno dei linguaggi C# e Visual Basic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con LINQ possiamo eseguire query e manipolare dati, sfruttando un unico modello di programmazione indipendente dalle varie tipologie di fonti. Per capire meglio di cosa si tratti, occorre per\u00f2 fare un piccolo salto nel passato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nelle prime versioni di C#, dovevamo utilizzare un ciclo&nbsp;<em>for&nbsp;<\/em>o&nbsp;<em>foreach<\/em>&nbsp;per iterare su una collezione, che come sappiamo implementa l\u2019interfaccia&nbsp;<em>IEnumerable<\/em>, e trovare ad esempio al suo interno un oggetto particolare. Il seguente codice restituisce tutti i clienti di un\u2019azienda con et\u00e0 compresa tra i 19 e i 36 anni (20 &#8211; 35 anni):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nclass Customer\n{ \n\u00a0\u00a0\u00a0public int CustomerID { get; set; } \n\u00a0\u00a0\u00a0public String CustomerName { get; set; } \n\u00a0\u00a0\u00a0public int Age { get; set; } \n} \n\u00a0\nclass Program \n{ \n\u00a0\u00a0\u00a0static void Main(string&#x5B;] args) \n\u00a0\u00a0\u00a0{ \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Customer&#x5B;] customerArray = { \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new Customer() { CustomerID = 1, CustomerName = &quot;Joy&quot;, Age = 22 }, \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new Customer() { CustomerID = 2, CustomerName = &quot;Bob&quot;, Age = 45 }, \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new Customer() { CustomerID = 3, CustomerName = &quot;Curt&quot;, Age = 25 },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Customer&#x5B;] customers = new Customer&#x5B;10]; \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0int i = 0; \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0foreach (Customer cst in customerArray) \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (cst.Age &gt; 19 &amp;&amp; cst.Age &lt; 36) \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0customers&#x5B;i] = cst; \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0i++; \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \n\u00a0\u00a0\u00a0} \n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Quale potrebbe essere un approccio alternativo? Proviamo ad arrivarci per passi, partendo dal concetto di&nbsp;<em>delegate<\/em>. Un&nbsp;<em>delegate&nbsp;<\/em>\u00e8 un&nbsp;<em>tipo&nbsp;<\/em>che rappresenta riferimenti a metodi con gli stessi parametri e tipo restituito. Esso \u201cdelega\u201d al metodo a cui punta l\u2019esecuzione del codice e possiamo dichiararlo in questo modo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic delegate bool Operations(int number);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Tutti i metodi che prendono in ingresso un numero intero e restituiscono un booleano possono essere puntati da questo&nbsp;<em>delegate<\/em>. Per esempio, supponiamo di avere in una classe&nbsp;<em>CustomerOperations<\/em>&nbsp;un metodo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic bool CustomerAgeRangeCheck(int number)\n{\n\u00a0\u00a0\u00a0\u00a0return number &gt; 19 &amp;&amp; number &lt; 36; \n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Abbiamo la possibilit\u00e0 di registrare uno o pi\u00f9 metodi che verranno eseguiti nel momento in cui verr\u00e0 eseguito il&nbsp;<em>delegate&nbsp;<\/em>stesso:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nOperations op = new Operations(CustomerOperations.CustomerAgeRangeCheck);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">O semplicemente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nOperations op = CustomerOperations.CustomerAgeRangeCheck;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Possiamo quindi utilizzare il&nbsp;<em>delegate<\/em>, che in questo caso restituir\u00e0 come risultato&nbsp;<em>true<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nop(22);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">I&nbsp;<em>delegate&nbsp;<\/em>vengono utilizzati per passare metodi come argomenti ad altri metodi: i gestori di evento e le callback sono un esempio di metodi richiamati tramite&nbsp;<em>delegate<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C# 2.0 ha introdotto i&nbsp;<em>delegate<\/em>&nbsp;<em>anonimi<\/em>, \u00e8 possibile ora utilizzare un metodo anonimo per dichiarare e inizializzare un delegato. Ad esempio possiamo scrivere:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndelegate bool CustomerFilters(Customer customer);\n\u00a0\u00a0\nclass CustomerOperations\n{\n\u00a0\u00a0\u00a0\u00a0public static Customer&#x5B;] FindWhere(Customer&#x5B;] customers, CustomerFilters\u00a0 customerFiltersDelegate)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0int i = 0;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Customer&#x5B;] result = new Customer&#x5B;6];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0foreach (Customer customer in customers)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (customerFiltersDelegate(customer))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result&#x5B;i] = customer;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0i++;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return result;\n\u00a0\u00a0\u00a0\u00a0}\n}\n\u00a0\u00a0\nclass Program\n{\n\u00a0\u00a0\u00a0\u00a0static void Main(string&#x5B;] args)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Customer&#x5B;] customers = {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new Customer() { CustomerID = 1, CustomerName = &quot;Joy&quot;, Age = 22 },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new Customer() { CustomerID = 2, CustomerName = &quot;Bob&quot;, Age = 45 },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new Customer() { CustomerID = 3, CustomerName = &quot;Curt&quot;, Age = 25 },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Customer&#x5B;] filteredCustomersAge = CustomerOperations.FindWhere(customers, delegate (Customer customer)\u00a0 \/\/Using anonimous delegate\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return customer.Age &gt; 19 &amp;&amp; customer.Age &lt; 36;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Quindi con C# 2.0, abbiamo il vantaggio utilizzare i&nbsp;<em>delegate anonimi<\/em>&nbsp;nella ricerca con criteri diversi, senza la necessit\u00e0 di utilizzare un ciclo&nbsp;<em>for<\/em>&nbsp;o&nbsp;<em>foreach<\/em>. Possiamo ad esempio usare la stessa funzione delegato utilizzata nell\u2019esempio precedente, per trovare un cliente il cui \u201cCustomerID\u201d \u00e8 3 o il cui nome \u00e8 \u201cBob\u201d:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nCustomer&#x5B;] filteredCustomersId = CustomerOperations.FindWhere(customers, delegate (Customer customer)\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return customer.CustomerID == 3;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\nCustomer&#x5B;] filteredCustomersName = CustomerOperations.FindWhere(customers, delegate (Customer customer)\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return customer.CustomerName == &quot;Bob&quot;;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Con l\u2019evoluzione del linguaggio, il team Microsoft ha introdotto dalla versione di C# 3.x nuove funzionalit\u00e0 che rendono il codice ancora pi\u00f9 compatto e leggibile, e che sono a diretto supporto di LINQ per eseguire query sui diversi tipi di fonti dati e ottenere gli elementi risultanti in una singola istruzione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Queste funzionalit\u00e0 sono:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&#8211; Il costrutto&nbsp;<em>var<\/em>, cio\u00e8 una variabile locale tipizzata in modo implicito. \u00c8 fortemente tipizzata come se si fosse dichiarato il tipo stesso, ma \u00e8 il compilatore a determinarne il tipo utilizzando l\u2019inferenza di tipo (Type Inference) sulla base del valore che gli viene assegnato. Le due dichiarazioni seguenti sono equivalenti dal punto di vista funzionale:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar customerAge = 30; \/\/ Implicitly typed.\nint customerAge = 30; \/\/ Explicitly typed.\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&#8211; Gli&nbsp;<em>object initializer<\/em>, che consentono di assegnare valori a tutte o ad alcune delle propriet\u00e0 di un oggetto in fase di creazione senza dover richiamare un costruttore seguito da righe di istruzioni di assegnazione.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nCustomer customer = new Customer { Age = 30, CustomerName = &quot;Adolfo&quot; };\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A differenza del seguente codice, nel caso precedente, il tutto viene considerato come una singola operazione.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nCustomer customer = new Customer();\ncustomer.Age = 30; \ncustomer.CustomerName = &quot;Adolfo&quot;;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">&#8211; Gli&nbsp;<em>anonymous type<\/em>, cio\u00e8 un tipo in sola lettura, che viene costruito dal compilatore ed \u00e8 solo il compilatore a conoscerlo. Inoltre, se due o pi\u00f9 inizializzatori di oggetti anonimi in un assembly specificano una sequenza di propriet\u00e0 nello stesso ordine e con gli stessi nomi e tipi, il compilatore considera gli oggetti come istanze dello stesso tipo. I tipi anonimi costituiscono una valida soluzione per raggruppare temporaneamente un set di propriet\u00e0 nel risultato di una query, senza dover definire un tipo denominato separato.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar customer = new { YearsOfFidelity = 10, Name = &quot;Francesco&quot;}; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&#8211; Gli&nbsp;<em>extension method<\/em>, o metodi di estensione, che consentono di &#8220;aggiungere&#8221; metodi ai tipi esistenti senza creare un nuovo tipo derivato, ricompilare o modificare in altro modo il tipo originale. I metodi di estensione sono metodi statici, ma vengono chiamati grazie alla syntactic sugar introdotta, come se fossero metodi di istanza sul tipo esteso.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic static class StringExtensionMethods\n{\n\u00a0\u00a0\u00a0\u00a0public static string ReverseString(this string input)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (string.IsNullOrEmpty(input)) return &quot;&quot;;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return new string(input.ToCharArray().Reverse().ToArray());\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Gli&nbsp;<em>extension method<\/em>&nbsp;devono essere definiti in una classe statica. Il primo parametro rappresenta il tipo da estendere e deve essere preceduto dalla keyword&nbsp;<em>this<\/em>, ulteriori parametri non ne necessitano.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nConsole.WriteLine(&quot;Hello&quot;.ReverseString());\u00a0\u00a0 \/\/olleH\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Da notare che il primo parametro, quello preceduto dal modificatore&nbsp;<em>this<\/em>, non deve essere specificato nella chiamata al metodo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&#8211; Le<em>&nbsp;lambda expression<\/em>, funzioni anonime che possono essere passate come variabile o come parametro nella chiamata di un metodo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ncustomer =&gt; customer.Age &gt; 19 &amp;&amp; customer.Age &lt; 36;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">L\u2019operatore =&gt; \u00e8 chiamato&nbsp;<em>lambda operator<\/em>, mentre&nbsp;<em>customer&nbsp;<\/em>\u00e8 il parametro in ingresso della funzione. Quello che c\u2019\u00e8 alla destra del&nbsp;<em>lambda operator<\/em>&nbsp;rappresenta il corpo della funzione ed il valore che restituisce, in questo caso un booleano.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Arriviamo quindi finalmente alla versione 3.5 di C# e all\u2019introduzione di LINQ.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Semplificando, potremmo dire che LINQ \u00e8 una libreria di&nbsp;<em>extension method<\/em>&nbsp;per le interfacce IEnumerable&lt;T&gt; e IQueryable&lt;T&gt;, che ci permette di effettuare diverse operazioni come filtrare, effettuare proiezioni, aggregazioni e ordinamento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo a disposizione diverse implementazioni di LINQ:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>LINQ to Objects (In-Memory Object Collection)<\/li><li>LINQ to Entities (Entity Framework)<\/li><li>LINQ to SQL (SQL Database)<\/li><li>LINQ to XML (XML Document)<\/li><li>LINQ to DataSet (ADO.Net Dataset)<\/li><li>Implementando l\u2019interfaccia IQueryable (Altre sorgenti di dati)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Negli esempi precedenti \u00e8 stata usata una matrice come origine dati, viene quindi supportata implicitamente l&#8217;interfaccia generica IEnumerable&lt;T&gt;. I tipi che supportano IEnumerable&lt;T&gt; o un&#8217;interfaccia derivata, ad esempio l&#8217;interfaccia generica IQueryable&lt;T&gt; sono denominati&nbsp;<em>tipi queryable<\/em>&nbsp;e ci permettono di eseguire direttamente query LINQ. Se i dati di origine non sono gi\u00e0 in memoria come&nbsp;<em>tipo queryable<\/em>, il provider LINQ deve rappresentarlo come tale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come abbiamo detto, le query LINQ sono basate per lo pi\u00f9 su tipi generici, introdotti nella versione 2.0 di .NET Framework. Questo vuol dire che se si tenta ad esempio di aggiungere un oggetto Customer a un oggetto List&lt;string&gt;, verr\u00e0 generato un errore in fase di compilazione. \u00c8 semplice usare le collection generiche poich\u00e9 non \u00e8 necessario eseguire il cast dei tipi in fase di esecuzione.<br>Se preferiamo possiamo evitare la sintassi generica usando la parola chiave&nbsp;<em>var<\/em>&nbsp;della quale abbiamo parlato precedentemente.<br>Vediamo quindi come possiamo ottenere lo stesso risultato che nell\u2019esercizio precedente abbiamo ottenuto utilizzando i&nbsp;<em>delegate anonimi<\/em>, utilizzando una query LINQ to Object, il costrutto&nbsp;<em>var<\/em>&nbsp;ed una<em>&nbsp;lambda expression<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar filteredCustomersAge = customers.Where(c =&gt; c.Age &gt; 19 &amp;&amp; c.Age &lt; 36);\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questo tipo di sintassi \u00e8 detta Method Syntax.<br>Nel prossimo esempio, utilizzeremo invece la Query Syntax, una sintassi introdotta per quelli che conoscono gi\u00e0 il linguaggio SQL e si sentirebbero quindi a loro agio con questo tipo di approccio:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar filteredCustomersAge =\n\u00a0\u00a0\u00a0\u00a0from customer in customers\n\u00a0\u00a0\u00a0\u00a0where customer.Age &gt; 19 &amp;&amp; customer.Age &lt; 36\n\u00a0\u00a0\u00a0\u00a0select customer;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La Query Syntax e la Method Syntax sono semanticamente identiche, molte persone trovano la sintassi delle query pi\u00f9 semplice e pi\u00f9 facile da leggere.<br>Nella Query Syntax, gli operatori di query LINQ vengono convertiti in chiamate ai relativi&nbsp;<em>extension method<\/em>&nbsp;di LINQ in fase di compilazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel prossimo articolo, continueremo a parlare di LINQ!<br>Parleremo dell\u2019interfaccia IQueryable&lt;T&gt;, dei relativi metodi di estensione di LINQ e delle differenze con l\u2019interfaccia IEnumerable&lt;T&gt;.<br>Vedremo inoltre l\u2019utilizzo di LINQ con fonti di dati provenienti da raccolte out-memory, come nel caso di database remoti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo! Stay Tuned!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo insieme come LINQ abbia rivoluzionato il modo con cui accediamo ai dati in .NET<\/p>\n","protected":false},"author":196716244,"featured_media":26603,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637382,688637383],"class_list":["post-26601","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-c","tag-linq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>LINQ: un linguaggio per domarli tutti! - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LINQ: un linguaggio per domarli tutti! - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo insieme come LINQ abbia rivoluzionato il modo con cui accediamo ai dati in .NET\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-16T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francesco Vastarella\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francesco Vastarella\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/\"},\"author\":{\"name\":\"Francesco Vastarella\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/388dae0ca9df603c88b5e41e29cf2d4d\"},\"headline\":\"LINQ: un linguaggio per domarli tutti!\",\"datePublished\":\"2020-06-16T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/\"},\"wordCount\":1248,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"C#\",\"Linq\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/\",\"name\":\"LINQ: un linguaggio per domarli tutti! - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-06-16T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:02+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/388dae0ca9df603c88b5e41e29cf2d4d\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/linq-un-linguaggio-per-domarli-tutti\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LINQ: un linguaggio per domarli tutti!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/388dae0ca9df603c88b5e41e29cf2d4d\",\"name\":\"Francesco Vastarella\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g\",\"caption\":\"Francesco Vastarella\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/francesco-vastarellablexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LINQ: un linguaggio per domarli tutti! - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/","og_locale":"it_IT","og_type":"article","og_title":"LINQ: un linguaggio per domarli tutti! - Blexin","og_description":"Vediamo insieme come LINQ abbia rivoluzionato il modo con cui accediamo ai dati in .NET","og_url":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/","og_site_name":"Blexin","article_published_time":"2020-06-16T22:00:00+00:00","article_modified_time":"2021-01-13T08:40:02+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Francesco Vastarella","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Francesco Vastarella","Tempo di lettura stimato":"8 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/"},"author":{"name":"Francesco Vastarella","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d"},"headline":"LINQ: un linguaggio per domarli tutti!","datePublished":"2020-06-16T22:00:00+00:00","dateModified":"2021-01-13T08:40:02+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/"},"wordCount":1248,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1","keywords":["C#","Linq"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/","url":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/","name":"LINQ: un linguaggio per domarli tutti! - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1","datePublished":"2020-06-16T22:00:00+00:00","dateModified":"2021-01-13T08:40:02+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/linq-un-linguaggio-per-domarli-tutti\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"LINQ: un linguaggio per domarli tutti!"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/388dae0ca9df603c88b5e41e29cf2d4d","name":"Francesco Vastarella","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b8deedae8f35372d5fba49f918006fb0a58a2943aff6ae52d3ff188e0c441bb?s=96&d=identicon&r=g","caption":"Francesco Vastarella"},"url":"https:\/\/blexin.com\/it\/author\/francesco-vastarellablexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/2753c67c-ebae-4900-b572-9b4148ce4887.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-6V3","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716244"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=26601"}],"version-history":[{"count":10,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26601\/revisions"}],"predecessor-version":[{"id":27768,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26601\/revisions\/27768"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/26603"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=26601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=26601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=26601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}