Entity Framework - Query di proiezione

LINQ to Entities

Uno dei concetti più importanti per comprendere LINQ to Entities è che si tratta di un linguaggio dichiarativo. L'attenzione si concentra sulla definizione delle informazioni necessarie, piuttosto che su come ottenerle.

  • Significa che puoi dedicare più tempo a lavorare con i dati e meno tempo a cercare di capire il codice sottostante richiesto per eseguire attività come l'accesso al database.

  • È importante capire che i linguaggi dichiarativi in ​​realtà non rimuovono alcun controllo dallo sviluppatore, ma aiutano lo sviluppatore a focalizzare l'attenzione su ciò che è importante.

Parole chiave essenziali per LINQ to Entities

È importante conoscere le parole chiave di base utilizzate per creare una query LINQ. Ci sono solo poche parole chiave da ricordare, ma puoi combinarle in vari modi per ottenere risultati specifici. Il seguente elenco contiene queste parole chiave di base e fornisce una semplice descrizione di ciascuna di esse.

Sr. No. Parola chiave e descrizione
1

Ascending

Specifica che un'operazione di ordinamento viene eseguita dall'elemento minimo (o più basso) di un intervallo all'elemento più alto di un intervallo. Questa è normalmente l'impostazione predefinita. Ad esempio, quando si esegue un ordinamento alfabetico, l'ordinamento sarebbe compreso nell'intervallo dalla A alla Z.

2

By

Specifica il campo o l'espressione utilizzata per implementare un raggruppamento. Il campo o l'espressione definisce una chiave utilizzata per eseguire l'attività di raggruppamento.

3

Descending

Specifica che un'operazione di ordinamento viene eseguita dall'elemento più grande (o più alto) di un intervallo all'elemento più basso di un intervallo. Ad esempio, quando si esegue un ordinamento alfabetico, l'ordinamento sarà compreso tra Z e A.

4

Equals

Utilizzato tra le clausole sinistra e destra di un'istruzione join per unire l'origine dati contestuale primaria all'origine dati contestuale secondaria. Il campo o l'espressione a sinistra della parola chiave equals specifica l'origine dati primaria, mentre il campo o l'espressione a destra della parola chiave equals specifica l'origine dati secondaria.

5

From

Specifica l'origine dati utilizzata per ottenere le informazioni richieste e definisce una variabile di intervallo. Questa variabile ha lo stesso scopo di una variabile utilizzata per l'iterazione in un ciclo.

6

Group

Organizza l'output in gruppi utilizzando il valore chiave specificato. Utilizza più clausole di gruppo per creare più livelli di organizzazione dell'output. L'ordine delle clausole di gruppo determina la profondità alla quale un particolare valore di chiave appare nell'ordine di raggruppamento. Combina questa parola chiave con by per creare un contesto specifico.

7

In

Usato in molti modi. In questo caso, la parola chiave determina l'origine database contestuale utilizzata per una query. Quando si lavora con un join, la parola chiave in viene utilizzata per ciascuna origine database contestuale utilizzata per il join.

8

Into

Specifica un identificatore che è possibile utilizzare come riferimento per clausole di query LINQ come join, group e select.

9

Join

Crea una singola origine dati da due origini dati correlate, ad esempio in una configurazione principale / dettagliata. Un join può specificare un join interno, di gruppo o sinistro-esterno, con il join interno come predefinito. Puoi leggere ulteriori informazioni sui join su msdn.microsoft.com

10

Let

Definisce una variabile di intervallo che è possibile utilizzare per archiviare i risultati della sottoespressione in un'espressione di query. In genere, la variabile intervallo viene utilizzata per fornire un output enumerato aggiuntivo o per aumentare l'efficienza di una query (in modo che una particolare attività, come trovare il valore minuscolo di una stringa, non debba essere eseguita più di una volta).

11

On

Specifica il campo o l'espressione utilizzata per implementare un join. Il campo o l'espressione definisce un elemento comune a entrambe le origini dati contestuali.

12

Orderby

Crea un ordinamento per la query. È possibile aggiungere la parola chiave crescente o decrescente per controllare l'ordine dell'ordinamento. Utilizza più clausole orderby per creare più livelli di ordinamento. L'ordine delle clausole orderby determina l'ordine in cui vengono gestite le espressioni di ordinamento, quindi l'utilizzo di un ordine diverso produrrà un output diverso.

13

Where

Definisce ciò che LINQ deve recuperare dall'origine dati. Utilizzi una o più espressioni booleane per definire le specifiche di cosa recuperare. Le espressioni booleane vengono separate l'una dall'altra utilizzando && (AND) e || (OR) operatori.

14

Select

Determina l'output della query LINQ specificando le informazioni da restituire. Questa istruzione definisce il tipo di dati degli elementi restituiti da LINQ durante il processo di iterazione.

Proiezione

Le query di proiezione migliorano l'efficienza dell'applicazione, recuperando solo campi specifici dal database.

  • Una volta che hai i dati, potresti voler proiettarli o filtrarli secondo necessità per modellare i dati prima dell'output.

  • Il compito principale di qualsiasi espressione LINQ to Entities è ottenere i dati e fornirli come output.

La sezione "Sviluppo di query LINQ to Entities" di questo capitolo mostra le tecniche per eseguire questa attività di base.

Diamo un'occhiata al seguente codice in cui verrà recuperato l'elenco degli studenti.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students select s;

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }
}

Oggetto singolo

Per recuperare un singolo oggetto studente è possibile utilizzare i metodi enumerabili First () o FirstOrDefault che restituiscono il primo elemento di una sequenza. La differenza tra First e FirstOrDefault è che First () genererà un'eccezione, se non ci sono dati di risultato per i criteri forniti mentre FirstOrDefault () restituisce il valore predefinito null, se non ci sono dati di risultato. Nello snippet di codice seguente verrà recuperato il primo studente dell'elenco il cui nome è Ali.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).FirstOrDefault<Student>();

   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}

Puoi anche usare Single () o SingleOrDefault per ottenere un singolo oggetto studente che restituisce un singolo elemento specifico di una sequenza. Nell'esempio seguente, viene recuperato un singolo studente il cui ID è 2.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.ID 
      == 2 select s).SingleOrDefault<Student>();
   string name = student.FirstMidName + " " + student.LastName;
	
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   Console.ReadKey();
}

Elenco di oggetti

Se vuoi recuperare l'elenco degli studenti il ​​cui nome è Ali, puoi usare il metodo enumerabile ToList ().

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Ordine

Per recuperare dati / elenchi in un ordine particolare è possibile utilizzare la parola chiave orderby. Nel codice seguente, l'elenco degli snippet degli studenti verrà recuperato in ordine crescente.

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students orderby
      s.FirstMidName ascending select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Query Standard vs Projection Entity Framework

Supponiamo di avere un modello Student che contiene ID, FirstMidName, LastName e EnrollmentDate. Se desideri restituire un elenco di Studenti, una query standard restituirà tutti i campi. Ma se vuoi solo ottenere un elenco di studenti che contengono i campi ID, FirstMidName e LastName. Qui è dove dovresti usare una query di proiezione. Di seguito è riportato il semplice esempio di query di proiezione.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students
      orderby s.FirstMidName ascending
      where s.FirstMidName == "Ali"

   select new {s.ID, s.FirstMidName, s.LastName};

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

La query di proiezione precedente esclude il campo EnrollmentDate. Questo renderà la tua applicazione molto più veloce.