La clausola let serve per memorizzare il risultato di una sottoespressione in una variabile che è
possibile riutilizzare in un altro punto della query in questione ed e molto utile se si vuole riutilizzare
la stessa espressione più volte all'interno della query.
Una volta definita una variabile e inizializzata con la clausola let, non è più possibile modificarla,
tuttavia se la variabile contiene un o dei tipi interrogabili e può a sua volta essere interrogata.
  
Questo esempio di query Linq mediante la clausola let verifica l'indice Mansione della matrice customers
con l'indice Mansione della matrice work , effettua tramite il metodo count il numro di occorrenze trovate è
con orderby vengono messi in ordine crescente e stampati poi a video
 
// Richiamo NameSpace dal sistema operativo
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
// Spazio dei nomi Linq_let
 namespace Linq_let_
 {
 // Classe Program
    class Program
    {
        // Metodo Statico Main
        static void Main(string[] args)
        {
            // Matrice customers
            var customers = new[]
            {

            // Dichiarazione Cliente 1 su matrice Nationomality
            new { CustomerID = 1, Nome = " Customer1 " , Mansione = " Elettricista " },
            // Dichiarazione Cliente 2 su matrice Nationomality 
            new { CustomerID = 2, Nome = " Customer2 " , Mansione = " Tubista " },
            // Dichiarazione Cliente 3 su matrice Nationomality 
            new { CustomerID = 3, Nome = " Customer3 " , Mansione = " Idraulico " },
            // Dichiarazione Cliente 4 su matrice Nationomality 
            new { CustomerID = 4, Nome = " Customer4 " , Mansione = " Meccanico " },
            // Dichiarazione Cliente 5 su matrice Nationomality 
            new { CustomerID = 5, Nome = " Customer5 " , Mansione = " Softerista " },
            // Dichiarazione Cliente 6 su matrice Nationomality 
            new { CustomerID = 6, Nome = " Customer6 " , Mansione = " Strumentista " },
            };

            // Matrice work
            var work = new[]
            {
            // Dichiarazione Cliente 1 su matrice work
            new {workID = 1, Mansione = " Elettricista " , Livello = " Quarto " },
            // Dichiarazione Cliente 2 su matrice work
            new {workID = 2, Mansione = " Tubista " , Livello = " Quarto " },
            // Dichiarazione Cliente 3 su matrice work 
            new {workID = 3, Mansione = " Idraulico " , Livello = " Quarto " },
            // Dichiarazione Cliente 4 su matrice work 
            new {workID = 4, Mansione = " Meccanico " , Livello = " Quarto " },
            // Dichiarazione Cliente 5 su matrice work 
            new {workID = 5, Mansione = " Softerista " , Livello = " Quarto " },
            // Dichiarazione Cliente 6 su matrice work 
            new {workID = 6, Mansione = " Imbianchino " , Livello = " Quarto " },
            };

            // Variabile dove andrà memorizzati il risultato della query
            var category = from c in customers
            // Confronta tramite join e equals i due indici Mansione
            join p in work on c.Mansione equals p.Mansione
            // Raggruppa il risultato all'interno di numbercustomers
            into numbercustomers
            // Memorizza il risultato della sottoespressione
            let totalcustomers = numbercustomers.Count()
            // I dati vengono ordinati in ordine crescente e in base al valore di totalcustomers
            orderby totalcustomers
            // Seleziona c.nome e totalcustomers da passare a category
            select new { c.Nome, totalcustomers };
  
            // Recupera dati da variabile custom e li passa a row
            foreach (var row in category)
            {
                // Visualizza a utente il nome,da matrice customer e Mansione e Livello da variabile work
                Console.WriteLine(row);
            }

            // Aspetta un tasto qualsiasi da tastiera
            Console.ReadLine(); 
       }
    }
 }