mercoledì 12 aprile 2023

C# creazione di un file pdf con le annotazioni tramite PdfSharp

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_csharp-creazione-di-un-file-pdf-con-le-annotazioni_1825.aspx

 In questo articolo viene illustrata una tecnica di come creare un file pdf, con l’aggiunta di annotazioni per fornire all’utente che aprirà il file, informazioni sul testo ed un’immagine ad indicare il documento finale, il tutto come mostrato in figura 1.

Figura 1 – La creazione delle note


Come illustrato nell’articolo introduttivo, qui https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_csharp-creazione-di-un-file-pdf-tramite-la-libreri_1822.aspx utilizzeremo la  libreria gratuita PdfSharp che può essere utilizzata anche per progetti commerciali. 

Può capitare di voler aggiungere nella creazione o gestione dei file pdf, delle note, tramite alcune classi della libreria PdfSharp vedremo come applicare tali aspetti in un nuovo file.

Il codice che utilizzeremo è per un progetto di tipo “Windows Application” ma è possibile applicarlo anche in ambito web, con la tecnologia Asp.Net.


Creazione del progetto


Si crea un nuovo progetto tramite l’ambiente di sviluppo “Visual Studio 2022 community”, selezioniamo come tipo di progetto “App Windows Form”, impostando un nome al progetto e selezionando come versione del .Net l’ultima, nel momento in cui stiamo scrivendo la versione 7, oppure apriamo il precedente progetto. 

Aggiungiamo al progetto la libreria “PdfSharp” nel caso che è un nuovo progetto, tramite “Nuget”, dopo aver aggiunto tale libreria, aggiungiamo un pulsante, il quale scriveremo il codice per la creazione del file “Pdf” con le annotazioni.

Il controllo di tipo pulsante, avrà la proprietà “text” con il valore “Annotazione” e la proprietà “Name” con il valore “BtnAnnotazione”.

Terminata la creazione del progetto ed aver impostato il controllo non resta che scrivere il codice per creare il file pdf.


Stesura del codice


Dopo aver aggiunto il riferimento alla libreria pdfsharp, dobbiamo aggiungere i vari spazio dei nomi (namespace) per utilizzare le varie classi della libreria, passiamo in visualizzazione codice, ed in alto sopra ad ogni dichiarazione, inseriamo lo spazio dei nomi.

Di seguito si riporta il frammento di codice delle suddette operazioni.


C#

using PdfSharp;

using PdfSharp.Drawing;

using PdfSharp.Pdf;

using PdfSharp.Pdf.Annotations;

using PdfSharp.Pdf.IO;

using System.Diagnostics;

using System.Text;

using static System.Windows.Forms.VisualStyles.VisualStyleElement;


Dopo aver aggiunto lo spazio dei nomi, passiamo in visualizzazione grafica, e facciamo doppio click sul pulsante in modo da passare in visualizzazione codice dell’evento click del pulsante.

In quest’evento scriveremo il codice per la creazione del file pdf con le annotazioni, utilizzando le classi messe a disposizione dal componente, in particolare le classi “PdfTextAnnotation” e “PdfRubberStampAnnotation”.

Con la classe “PdfTextAnnotation” impostando alcune proprietà, come il titolo, il testo, ed altro permettendo di gestire le informazioni che saranno successivamente visibili nel file pdf tra le annotazioni,  con l’oggetto creato, impostiamo tramite la classe “Xrect” l’area di formattazione dell’annotazione. Una volta impostato l’oggetto di tipo “PdfTextAnnotation” l’aggiungiamo alla proprietà “Annotations” dell’oggetto di tipo “PdfDocument”, in questo modo si creano le annotazioni nel file pdf, mentre con la classe “PdfRubberStampAnnotation”,  impostiamo alcune proprietà quali “flags” e “icon” che permettono rispettivamente di fissare nella pagina l’immagine scritta della proprietà “Icon”, che nel nostro caso riguarda l’immagina con la dicitura “Finale”.


Oltre alla classe “PdfDocument” per la creazione e gestione dei file, come visto nell’articolo introduttivo a questo componente utilizzeremo la classe “Font” per la gestione dei caratteri e la classe “PdfPage” per gestire le singole pagine.


Di seguito si riporta il frammento di codice delle suddette operazioni.


C#

private void BtnAnnotazione_Click(object sender, EventArgs e)

        {

            try

            {

 

 

                //Creo un documento per la gestione del pdf

                PdfDocument documentoPdf = new PdfDocument();

                //Imposto il titolo

                documentoPdf.Info.Title = "Titolo del nuovo file Pdf";

                //Aggiungo una pagina

 

                PdfPage pagina = documentoPdf.AddPage();

                //Oggetto grafica per la scrittura nella pagina

                XGraphics XgfxScrittura = XGraphics.FromPdfPage(pagina);

                //Oggetto per le annotazoni

                PdfTextAnnotation pdfAnnotazioni = new PdfTextAnnotation()

                {

                    Title = "Titolo annnotazione",

                    Subject = "Oggetto annotazione",

                    Contents = "Contenuto dell'annotazione ossia il testo. \r Testo in seconda linea",

                    Icon = PdfTextAnnotationIcon.Note

 

 

                };

                XFont font = new XFont("Verdana", 12, XFontStyle.BoldItalic);

                XgfxScrittura.DrawString("Testo dove andrà inserita l'annotazione.", font, XBrushes.Black, 30, 50, XStringFormats.Default);

                //Definisco il rettangolo per l'annotazione

                XRect rect = XgfxScrittura.Transformer.WorldToDefaultPage(new XRect(new XPoint(30, 60), new XSize(30, 30)));

                pdfAnnotazioni.Rectangle = new PdfRectangle(rect);

                //Aggiungo l'annotazione

                pagina.Annotations.Add(pdfAnnotazioni);

                //Aggiungo altra annotazione

                pdfAnnotazioni = new PdfTextAnnotation()

                {

                    Title = "Seconda annotazione.",

                    Subject = "Esempio secondo annotazione aperta.",

                    Contents = "Testo presente nell'annotazione.",

                    Icon = PdfTextAnnotationIcon.Help,

                    Color = XColors.Aquamarine,

                    Opacity = 0.7,

                    Open = true

 

 

 

                };

 

                XgfxScrittura.DrawString("Testo dove andrà inserita la seconda annotazione.", font, XBrushes.Black, 30, 140, XStringFormats.Default);

                //Definisco il rettangolo per l'annotazione

                rect = XgfxScrittura.Transformer.WorldToDefaultPage(new XRect(new XPoint(30, 150), new XSize(30, 30)));

                pdfAnnotazioni.Rectangle = new PdfRectangle(rect);

                //Aggiungo l'annotazione

                pagina.Annotations.Add(pdfAnnotazioni);

                //Aggiungo una icona/scritta

                PdfRubberStampAnnotation pulsanteAnnotazioni = new PdfRubberStampAnnotation()

                {

                    Flags = PdfAnnotationFlags.Print,

                    Icon = PdfRubberStampAnnotationIcon.Final

                };

 

                rect = XgfxScrittura.Transformer.WorldToDefaultPage(new XRect(new XPoint(100, 400), new XSize(350, 150)));

                pulsanteAnnotazioni.Rectangle = new PdfRectangle(rect);

                pagina.Annotations.Add(pulsanteAnnotazioni);

                //Salvo il documento

 

                string filename = "C:\\Varie\\FilePdfSharpAnnotazione.pdf";

 

                documentoPdf.Save(filename);

 

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }


Conclusioni 


L’articolo ha voluto fornire un utilizzo particolare della libreria gratuita “PdfSharp” in particolare per la creazione delle annotazioni da aggiungere nel file pdf, fornendo informazioni aggiuntive su determinate porzioni di testo.

Tramite le varie classi della libreria è possibile aggiungere ai propri progetti funzionalità sulla gestione dei file, fornendo al programmatore uno sviluppo applicativo agevolato e rapido.

martedì 11 aprile 2023

Sql Server elencare le colonne di una determinata tabella

Nell'eventualità che vogliamo conoscere informazioni sulle colonne di una determinata tabella, come il nome, tipo, lunghezza ed altre informazioni utili, tramite l'istruzione SQL qui di seguito estrapoliamo le informazioni in base ad una determinata tabella.


SELECT *
FROM NomeServer.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'NomeTabella';

lunedì 10 aprile 2023

Strumento gratuito per decompilare librerie .Net Telerik JustDecompile

Dal sito Telerik è possibile scaricare uno strumento gratuito per decompilare codice .Net, in particolare se abbiamo delle librerie scritte con tecnologia .Net è possibile estrapolare il codice.
Lo strumento Telerik JustDecompile https://www.telerik.com/products/decompiler.aspx fornisce interessanti funzionalità, il download è gratuito e non richiede ne registrazione e ne email.
Per maggiori informazioni e download visitate il sito indicato.

domenica 9 aprile 2023

Download gioco shapez

 

Disponibile gratuitamente il gioco di strategia Shapez per sistemi operativi Windows, con una semplice giocabilità, adatto a tutta la famiglia.

Il gioco è anche in lingua italiana.

Fino al 13 aprile 2023 si potrà scaricare gratuitamente dopo tale data, il download sarà a pagamento.

Per il download e maggiori informazioni visitate il seguente sito shapez | Acquistalo e scaricalo subito sull'Epic Games Store

Sql Server rilevare i nomi delle tabelle presenti nel database

Nel caso che abbiamo necessità di avere l'elenco dei nomi delle tabelle presenti in un database Sql Server, l'istruzione SQL qui di seguito riporta tutti i nomi presenti in un database.


SELECT
  *
FROM
  NomeDatabase.INFORMATION_SCHEMA.TABLES
  WHERE
  TABLE_TYPE = 'BASE TABLE'
  order by TABLE_NAME asc

sabato 8 aprile 2023

Download gioco Dying Light: Enhanced Edition

 


Il gioco Dying Light, è un gioco sparatutto contro zombi per un pubblico adulto.

Il gioco è in lingua italiana e per sistemi operativi Windows ed offre una buona grafica.

Fino al 13 aprile 2023 è possibile scaricarlo gratuitamente, dopo tale data il download sarà a pagamento, per maggiori informazioni ed altro visitate il seguente sito Dying Light: Enhanced Edition | Acquistalo e scaricalo subito sull'Epic Games Store

Sql Server elencare la lista delle viste presenti in un database

Il frammento di codice SQL qui di seguito illustra una tecnica per elencare tutte le viste presenti in un database di Sql Server.


SELECT
  *
FROM
  NomeDatabase.INFORMATION_SCHEMA.TABLES
  WHERE
  TABLE_TYPE = 'VIEW'
  order by TABLE_NAME asc

venerdì 7 aprile 2023

Elencare le Stored Procedure in Sql Server

L'istruzione SQL qui di seguito, illustra una tecnica per elencare tutte le Stored Procedure presenti in un database di SQL server.

SELECT
  *
FROM
  NomeDatabase.INFORMATION_SCHEMA.ROUTINES
  WHERE
  ROUTINE_TYPE  = 'PROCEDURE'
  order by ROUTINE_NAME  asc

giovedì 6 aprile 2023

C# Creazione di un user control con .Net 7 estendere una textbox

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_csharp-creazione-di-un-user-control-con-dotnet-7-e_1824.aspx


In questo articolo vedremo come estendere il controllo della casella di testo (textbox) aggiungendo particolarità funzionalità quale la possibilità di scrivere solo numeri, o solo lettere, ed altri interessanti personalizzazioni che possono tornare utili nello sviluppare applicazioni di tipo “Windows Application”.
L’articolo vuole fornire al lettore la conoscenza di base per la creazione di controlli personalizzati, detti usercontrol) che si possono riutilizzare in altri progetti e ed in altre applicazioni.
Gli userControl, permettono la creazione dei controlli personalizzati che possono estendere quelli già disponibili per lo sviluppo di applicazioni di tipo eseguibile, oltre ad offrire la possibilità di riutilizzarli in più progetti senza riscrivere il codice tante volte.
Nell’articolo vedremo come creare un controllo personalizzato con l’ultima versione del Framework .Net, al momento in cui si sta scrivendo l’articolo è il 7, con l’ambiente di sviluppo Visual Studio 2022 Community ed il linguaggio di programmazione C#.

Creazione del progetto

Si crea un nuovo progetto di tipo “App Windows forms” impostando un nome  e nella finestra successiva selezionare la versione del Framework  7.
Ultimata la creazione del progetto, aggiungiamo al progetto un nuovo elemento di tipo “Controllo Utente”, il tutto tramite il pulsante destro sul nome progetto nella finestra di “Esplora soluzioni”, e dal menu che viene visualizzato, selezionare la voce “Aggiungi” e nel sottomenu la voce “Controllo utente (Windows Forms)) il tutto come mostrato in figura 1.


Figura 1 – Il menu con la voce da selezionare


A questo punto verrà creato quale nome impostare per il controllo (per esempio impostare UscTextBoxAvanzata) , assegnate un nome e confermate il tutto tramite il pulsante “OK”.
Nel controllo che sarà di colore griglio, trasciniamo un controllo di tipo “TextBox” con la proprietà “Name” impostata su “TxtTesto”, un controllo di tipo “Button” con la proprietà “Text” impostata con i tre pulsantini piccoli, la proprietà “Name” con il valore “btnFinestra” ed infine un controllo “Textbox” con la proprietà “Name” impostata su “TxtErrore”, la proprietà “MultiLine” su “True” e la proprietà “ReaOnly” impostata a true, il tutto come mostrato in figura 2.

Figura 2 – Il controllo personalizzato.


Il pulsante avrà la funzionalità di aprire una finestra di selezoinare cartella e riportare nella casella di testo (TxtTesto) il percorso e nome del file che ha selezionato. Mentre la casella della parte inferiore, visualizzerà un messaggio di errore.


Stesura del codice

Terminata la creazione dell’aspetto grafico della casella personalizzata non resta che scrivere il codice.
Il codice che andremo a creare sarà quello di far comprendere come creare delle proprietà che permettono di personalizzare il controllo secondo le esigenze dell’utente, inoltre è anche un modo per capire come impostare alcune informazioni e visualizzare il tutto nella barra delle proprietà.
Facciamo doppio click sul pulsante, in modo che passiamo in visualizzazione codice nell’evento click del pulsante.
In questo evento, scriviamo il codice per visualizzare a video una finestra per dove salvare il file e riportare nella casella di testo, il percorso e nome del file.
Qui di seguito si riporta il frammento di codice delle suddette operazioni.

 

C#

private void btnFinestra_Click(object sender, EventArgs e)

        {

            OpenFileDialog openDlg = new OpenFileDialog();

            openDlg.Title = "Trova Percorso";

            if (openDlg.ShowDialog() == DialogResult.OK)

            {

                TxtTesto.Text = openDlg.FileName;

            }

        }




Terminata la stesura per la visualizzazione di una finestra modale per la selezione di un file, scriviamo il codice per creare delle proprietà, il quale programmatore imposterà per eseguire determinate funzioni.  Le proprietà che andremo a creare riguardano vari tipi, una di tipo booleana che ci permette di rendere il pulsante visibile o nascosto, un’altra di tipo enumerazione, con il quale imposteremo che la digitazione dei dati dev’essere solo numerica o solo testo.
Di seguito si riporta il frammento di codice per la creazione di una proprietà di tipo booleana che permette di rendere il pulsante visibile o nascosto, ed in base a determinati attributi fornire informazioni nella barra delle proprietà dell’ambiente di sviluppo, quale il tipo di valore ammesso, una descrizione, in quale categoria inserire la proprietà ed il valore di default.
Di seguito si riportano le suddette operazioni per la creazione della proprietà.


C#

[Browsable(true)]

        [Description("Visualizza se il pulsante dev'essere visibile oppure no.")]

        [Category("Layout")]

        [DefaultValue(true)]

        public bool VisibilePulsante

        {

            get => btnFinestra.Visible;

            set => btnFinestra.Visible = value;

 

        }


Ora dobbiamo creare oggetto di tipo “enumerazione”, che utilizzeremo per gestire la proprietà e che permetterà di validare in dati in base al carattere digitato nella casella di testo.
Di seguito si riporta il codice per il tipo enum che utilizzeremo per la proprietà.

C#

public enum TipoDiCasella

        {

            Standard,

            Testo,

            Numerica

        }

Il frammento di codice precedente, crea un enum con tre voci, con il valore “standard” permette di digitare qualunque testo, con il valore “Testo” solo caratteri dalla A alla Z, con il valore “Numerica” solo numeri.
Per gestire la selezione del dato o rilevarlo, occorre creare una variabile di livello classe, che possiamo utilizzare sia per la proprietà e sia durante l’evento di digitazione della casella di testo.
Di seguito si riporta il frammento di codice della creazione della variabile membro.

C#

  private TipoDiCasella m_TipoCasella;


Questa variabile la utilizzeremo per impostare o rilevare il valore che il programmatore ha impostato nella finestra delle proprietà per indicare il tipo di casella da utilizzare.
La proprietà sarà del tipo dell’enumerazione creata in precedenza, con il valore di default impostato su “Standard”.
Di seguito si riporta il frammento di codice delle suddette operazioni.

C#

[Browsable(true)]

        [Description("Visualizza la tipologia della casella.")]

        [Category("Layout")]

        [DefaultValue(TipoDiCasella.Standard)]

        public TipoDiCasella TipoCasella

        {

            get => m_TipoCasella;

            set => m_TipoCasella = value;

 

        }


Come si è visto dal frammento di codice precedente, oltre ad impostare i vari attributi che saranno visibili nella finestra delle proprietà dell’ambiente di sviluppo “Visual Studio”, quali la descrizione, la categoria, il tipo di proprietà che è enumerazione che restituisce o imposta la variabile privata creata come membro della classe.
A questo punto è rimasta l’ultima modifica, quella di verificare nell’evento “keyPress” il carattere digitato e verificare se è valido o no in base alla proprietà “tipoCasella”.
Passiamo in visualizzazione grafica, e nella casella di testo facciamo doppio click nell’evento “KeyPress” della finestra delle proprietà, in questo modo viene visualizzata la parte di codice nell’evento.
In quest’evento, verifichiamo il valore impostato per la proprietà “TipoCasella” in questo modo viene gestito il carattere digitato e se validarlo oppure no.
Di seguito si riporta il frammento di codice dell’evento Keypress della casella di testo nel quale viene utilizzata la proprietà creata in precedenza.

C#

private void TxtTesto_KeyPress(object sender, KeyPressEventArgs e)

        {

            TxtErrore.Text = "";

            if (m_TipoCasella == TipoDiCasella.Numerica)

            {

                if (char.IsNumber(e.KeyChar.ToString(), 0) == false)

                {

                    e.Handled = true;

                    TxtTesto.Select(0, TxtTesto.Text.Length);

                    TxtErrore.Text = "Solo numeri.";

                    TxtErrore.Visible = true;

                }

            }

            if (m_TipoCasella == TipoDiCasella.Testo)

            {

                if (char.IsLetter(e.KeyChar.ToString(), 0)==false)

                {

                    e.Handled = true;

                    TxtTesto.Select(0, TxtTesto.Text.Length);

                    TxtErrore.Text = "Solo lettere.";

                    TxtErrore.Visible = true;

                }

 

            }

        }


Come si è visto nel precedente frammento di codice, qualora la validazione del carattere non è convalidata, visualizza un messaggio di errore tramite la casella di testo denominata “TxtErrore”, fornendo così all’utente un messaggio informativo.
Di seguito si riporta il codice completo dell’articolo per fornire al lettore una visione completo di quanto illustrato e per poter avere una base su cui iniziare.


C#

public partial class UscTextBoxAvanzata : UserControl

    {

        public UscTextBoxAvanzata()

        {

            InitializeComponent();

 

        }

 

        public enum TipoDiCasella

        {

            Standard,

            Testo,

            Numerica

        }

        private TipoDiCasella m_TipoCasella;

 

        [Browsable(true)]

        [Description("Visualizza se il pulsante dev'essere visibile oppure no.")]

        [Category("Layout")]

        [DefaultValue(true)]

        public bool VisibilePulsante

        {

            get => btnFinestra.Visible;

            set => btnFinestra.Visible = value;

 

        }

 

        [Browsable(true)]

        [Description("Visualizza la tipologia della casella.")]

        [Category("Layout")]

        [DefaultValue(TipoDiCasella.Standard)]

        public TipoDiCasella TipoCasella

        {

            get => m_TipoCasella;

            set => m_TipoCasella = value;

 

        }

 

 

        private void btnFinestra_Click(object sender, EventArgs e)

        {

            OpenFileDialog openDlg = new OpenFileDialog();

            openDlg.Title = "Trova Percorso";

            if (openDlg.ShowDialog() == DialogResult.OK)

            {

                TxtTesto.Text = openDlg.FileName;

            }

        }

 

      

      

 

      

 

 

        private void TxtTesto_KeyPress(object sender, KeyPressEventArgs e)

        {

            TxtErrore.Text = "";

            if (m_TipoCasella == TipoDiCasella.Numerica)

            {

                if (char.IsNumber(e.KeyChar.ToString(), 0) == false)

                {

                    e.Handled = true;

                    TxtTesto.Select(0, TxtTesto.Text.Length);

                    TxtErrore.Text = "Solo numeri.";

                    TxtErrore.Visible = true;

                }

            }

            if (m_TipoCasella == TipoDiCasella.Testo)

            {

                if (char.IsLetter(e.KeyChar.ToString(), 0)==false)

                {

                    e.Handled = true;

                    TxtTesto.Select(0, TxtTesto.Text.Length);

                    TxtErrore.Text = "Solo lettere.";

                    TxtErrore.Visible = true;

                }

 

            }

        }

    }





Conclusioni

L’articolo ha fornito al lettore le basi per la creazione di controlli personalizzati in ambito di “Windows Application”, permettendo di vedere uno scenario molto ampio e che offre grande potenzialità ed opportunità di business, per migliorare lo sviluppo software.
La creazione dei controlli è una tecnica che in passato era molto utilizzata anche per dotare quelle funzionalità ed aspetti grafici ai controlli standard che non erano presenti.

mercoledì 5 aprile 2023

Servizio gratuito di hosting gratuito di condivisione file

 


Un ottimo servizio gratuito di condivisione dei file che non richiede ne indirizzo email e registrazione, quello offerto dal sito https://pixeldrain.com/, permettendo alle persone di condividere sul web file, tramite link, qrcode ed altre modalità.

Il sito nonostante è in lingua inglese è facilmente utilizzabile, dopo aver caricato i file tramite il pulsante "upload file", viene proposta la modalità in cui condividere, se tramite link o altro.

Per maggiori informazioni ed utilizzo visitate il seguente sito https://pixeldrain.com/

martedì 4 aprile 2023

Programma gratuito per unire più immagini

 

Un programma gratuito ed anche in versione portatile quello offerto dal sito https://bggenerator.com/batch_image_combiner.html che offre la possibilità di selezionare dal proprio pc, 2 o più immagini da unire.

Il programma è anche in lingua italiana ma il sito è in lingua inglese, non richiede nessuna registrazione e nessun indirizzo email da lasciare.

Una volta selezionate le immagini, il percorso dove creare la nuova immagine e la tipologia di unione, se orizzontale o verticale, tramite il pulsante "Avvia" è possibile eseguire la creazione dell'immagine.

Per maggiori informazioni e download visitate il sito indicato.


lunedì 3 aprile 2023

Sito per download immagini sulla natura

Dal seguente sito Nature Pic 4 Free è possibile sfogliare e scaricare gratuitamente immagini sulla natura ed animali.
Un portale che permette di ricercare immagini e vedere quelli presenti nel sito.
Il download non richiede ne email e ne registrazione.

domenica 2 aprile 2023

C# espressioni regolari solo numeri positivi

Di seguito, si riporta un frammento di codice per utilizzare espressione regolare per verificare se il numero digitato è positivo, ossia da 0 a 999999.

string Espressione= @"^[1-9]\d{0,5}$";
bool risultato = Regex.IsMatch(ValoreDaEsaminare, Espressione);

sabato 1 aprile 2023

C# linq distinct

Di seguito si riporta un frammento di codice, che raggruppa i dati in base ad un campo e tramite il metodo "FirstOfDefault" estrapola il dato univoco, che nel linguaggio SQL può considerarsi la "Distinct".

Di seguito il frammento di codice per ottenere dati univoci.

 var allegati = FonteDati
                .Where(g => !string.IsNullOrEmpty(g.NomeCampo))
                .GroupBy(g => g.Campo)
                .Select(g => g.FirstOrDefault())
                .Select(g=> new Classe
                { 
                    CampoDellaClasse = g.Campo
                })
                .ToList();