Come usare le proiezioni in C #

La proiezione è un'operazione che trasforma i risultati di una query. È possibile utilizzare la proiezione per trasformare un oggetto in una nuova forma che abbia solo le proprietà necessarie nell'applicazione. In questo articolo vedremo come lavorare con le proiezioni in C #.

Per lavorare con gli esempi di codice forniti in questo articolo, dovresti avere Visual Studio 2019 installato nel tuo sistema. Se non hai già una copia, puoi scaricare Visual Studio 2019 qui. 

Crea un progetto di applicazione console in Visual Studio

Prima di tutto, creiamo un progetto di applicazione console .NET Core in Visual Studio. Supponendo che Visual Studio 2019 sia installato nel sistema, seguire i passaggi descritti di seguito per creare un nuovo progetto di applicazione console .NET Core in Visual Studio.

  1. Avvia l'IDE di Visual Studio.
  2. Fai clic su "Crea nuovo progetto".
  3. Nella finestra "Crea nuovo progetto", seleziona "App Console (.NET Core)" dall'elenco dei modelli visualizzati.
  4. Fare clic su Avanti.
  5. Nella finestra "Configura il tuo nuovo progetto" mostrata di seguito, specifica il nome e la posizione per il nuovo progetto.
  6. Fare clic su Crea.
  7. Questo creerà un nuovo progetto di applicazione console .NET Core in Visual Studio 2019. Useremo questo progetto nelle sezioni successive di questo articolo.

Cos'è la proiezione in C #?

La proiezione si riferisce all'atto di trasformare un oggetto in una nuova forma in modo tale che l'oggetto appena creato contenga solo le proprietà che verranno utilizzate. LINQ (Language Integrated Query) fornisce supporto per due operatori di proiezione di query standard, Select e SelectMany.

È possibile utilizzare gli operatori Select e SelectMany per proiettare una singola proprietà, proiettare i risultati di una query o proiettare più proprietà da un'origine dati in un tipo anonimo. È anche possibile eseguire calcoli, filtri o qualsiasi altra operazione su una proiezione, se necessario.

Nelle sezioni che seguono esamineremo come possiamo lavorare con questi operatori in C #.

Progetto utilizzando l'operatore Seleziona in C #

Scrivi il codice seguente nel file Program.cs.

public class Autore

{

    public int Id {get; impostato; }

    stringa pubblica FirstName {get; impostato; }

    stringa pubblica LastName {get; impostato; }

    stringa pubblica Indirizzo {get; impostato; }

    public Author (int id, string firstName,

    string lastName, string address)

    {

        this.Id = id;

        this.FirstName = firstName;

        this.LastName = lastName;

        this.Address = indirizzo;

    }

}

Il frammento di codice seguente illustra come sfruttare l'operatore Seleziona per eseguire query sui dati.

var autori = nuovo elenco

{

   nuovo autore (1, "Joydip", "Kanjilal", "Hyderabad, INDIA"),

   nuovo autore (2, "Anand", "Naraswamy", "Cochin, INDIA"),

   nuovo autore (3, "Steve", "Smith", "Ohio, USA"),

   nuovo autore (4, "Uday", "Denduluri", "London, UK")

};

foreach (nome var in autori.Select (e => e.FirstName))

{

   Console.WriteLine (nome);

}

Quando esegui lo snippet di codice sopra, i primi nomi di tutti gli autori verranno visualizzati nella finestra della console.

Progetto su tipi anonimi in C #

Puoi proiettare più di una proprietà da un'origine dati, puoi anche proiettare su un tipo anonimo. Il frammento di codice seguente illustra come proiettare più proprietà in un tipo anonimo.

var data = autori.Select (e => new {e.FirstName, e.LastName});

Progetto utilizzando l'operatore SelectMany in C #

È possibile sfruttare l'operatore SelectMany per eseguire query sui dati da una raccolta che implementa l'interfaccia IEnumerable. È possibile utilizzare l'operatore SelectMany quando si desidera eseguire query sui dati di diverse raccolte e proiettarli o appiattirli in un'unica sequenza.

Notare che sia Select che SelectMany producono un risultato dai valori di origine. Mentre Select produce un singolo risultato da ogni valore di origine, SelectMany produce una sotto-raccolta concatenata da ciascun valore di origine.

Includiamo ora una proprietà extra nella classe Author denominata Soggetti. Questa proprietà è un elenco di stringhe che contengono i nomi degli argomenti su cui l'autore scrive libri.

public class Autore

    {

        public int Id {get; impostato; }

        stringa pubblica FirstName {get; impostato; }

        stringa pubblica LastName {get; impostato; }

        stringa pubblica Indirizzo {get; impostato; }

        soggetti elenco pubblico {get; impostato; }

        public Author (int id, string firstName, string lastName,

        indirizzo stringa, elenco soggetti)

        {

            this.Id = id;

            this.FirstName = firstName;

            this.LastName = lastName;

            this.Address = indirizzo;

            this.Subjects = soggetti;

        }

    }

È possibile utilizzare il seguente frammento di codice per creare un elenco di autori.

var autori = nuovo elenco

{

    nuovo autore (1, "Joydip", "Kanjilal", "Hyderabad, INDIA",

    nuovo elenco {"C #", "F #"}),

    nuovo autore (2, "Anand", "Naraswamy", "Cochin, INDIA", 

    nuovo elenco {"C #", "VB.NET"}),

    nuovo autore (3, "Steve", "Smith", "Ohio, USA", 

    nuovo elenco {"C #", "C ++"}),

    nuovo autore (4, "Uday", "Denduluri", "London, UK", 

    nuovo elenco {"C #", "VB.NET"}),

    nuovo autore (5, "Jane", "Barlow", "London, UK", 

    nuovo elenco {"C #", "C ++"})

 };

E puoi usare lo snippet di codice qui sotto per recuperare i nomi dei linguaggi di programmazione su cui gli autori scrivono libri.

var data = autori.SelectMany (a => a.Subjects) .Distinct ();

foreach (var subject in data)

{

    Console.WriteLine (oggetto);

}

Usare l'operatore Where per filtrare i dati dei risultati in C #

È possibile applicare l'operatore Where dopo SelectMany per filtrare il set di risultati. Il seguente frammento di codice quando eseguito mostra il FirstName e il Subject dell'autore il cui FirstName inizia con il carattere "J" e risiede nel Regno Unito

var data = autori

.Where (a => a.Address.IndexOf ("UK")> = 0)

.SelectMany (a => a.Subjects, (a, Subject) => new {a.FirstName, Subject})

.Where (n => n.FirstName.StartsWith ("J"));

foreach (var author in data)

{

    Console.WriteLine (autore);

}

Quando esegui lo snippet di codice sopra, dovresti vedere l'output nella finestra della console come mostrato nell'immagine dello schermo qui sotto.

Le proiezioni possono essere usate quando si lavora con EF Core, quindi è possibile recuperare solo le colonne dal database sottostante necessarie per l'applicazione. In un prossimo articolo qui, discuterò alcune operazioni avanzate che utilizzano proiezioni come proiezioni uno-a-molti, filtraggio dei risultati e ordinamento.