// Esempio di query Linq 
// join
// La clausola join permette di associare differenti datasource sulla base di un membro. Non e possibile
// confrontare con la clausola join con maggiore di, minore di, diverso da, epossibile solo effettuare confronti di
// uguaglianza. 
// Questo esempio di query Linq mediante la clausola join confronta l'indice Mansione della matrice customers
// con l'indice Mansione della matrice work, restituendo un elenco di customers con la stessa mansione comprendente il nome , la mansione e
// il livello di ogni customers.

// Richiamo NameSpace dal sistema operativo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// Spazio dei nomi Linq_join_
namespace Linq_join_ 

    // Classe Program
    class Program
    { 
        // Metodo Statico Main
        static void Main(string[] args) 
        { 
            // Richiamo metodo Unione
            Unione(); 
        }
 
        // Metodo Statico Unione
        public static void Unione() 
        {
 
            // 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 = " Softerista " , Livello = " Quarto " }, 
            };
 
            // Seleziona dati da da Matrice customers, e vrrifica se la mansione dei customers e uguale 
            // alla mansione della matrice work , e infine restituisce un elenco con il nome,Mansione e Livello.
            var custom = customers .
            // Clausola Select , ovvero seleziona con parametro c il none e mansione della matrice customers
            Select(c => 
            new {c.Nome , c.Mansione}) 
            // Esegue il confronto trà la variabile customers e work
            .Join(work , custs => custs.Mansione , job => job.Mansione,(custs , job ) => 
            // Restituisce l'elenco delle corrispondenze trovate dopo il confronto
            new {custs.Nome , job.Mansione,job.Livello}); 
            // Variabile appoggio numero customers trovati
            int iCustomers = 0;

            // Recupera dati da variabile custom e li passa a row
            foreach ( var row in custom) 
            {   
                // Incrementa variabile appoggio numero customers trovati
                iCustomers ++; 
                // Visualizza a utente il nome,da matrice customer e Mansione e Livello da variabile work
                Console.WriteLine("Customer number" + '\t' + iCustomers.ToString() + '\t' + row.Nome + '\t' + row.Mansione + '\t' + row.Livello);
            }
 
            // Riga vuota
            Console.WriteLine(); 
            // Riga vuota
            Console.WriteLine("Premere un tasto per uscire"); 
            // Aspetta un tasto qualsiasi da tastiera
            Console.ReadLine(); 
        } 
    } 
}