LINQ - Panoramica

Gli sviluppatori di tutto il mondo hanno sempre riscontrato problemi nell'esecuzione di query sui dati a causa della mancanza di un percorso definito e della necessità di padroneggiare un multiplo di tecnologie come SQL, Web Services, XQuery, ecc.

Introdotto in Visual Studio 2008 e progettato da Anders Hejlsberg, LINQ (Language Integrated Query) consente di scrivere query anche senza la conoscenza di linguaggi di query come SQL, XML ecc. Le query LINQ possono essere scritte per diversi tipi di dati.

Esempio di una query LINQ

C #

using System;
using System.Linq;

class Program {
   static void Main() {
   
      string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
		
      //Get only short words
      var shortWords = from word in words where word.Length <= 5 select word;
	    
      //Print each word out
      foreach (var word in shortWords) {
         Console.WriteLine(word);
      }	 
		
      Console.ReadLine();
   }
}

VB

Module Module1
   Sub Main()
      Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
     
      ' Get only short words
      Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
     
      ' Print each word out.
	  
      For Each word In shortWords
         Console.WriteLine(word)
      Next
	  
      Console.ReadLine()
   End Sub
End Module

Quando il codice precedente di C # o VB viene compilato ed eseguito, produce il seguente risultato:

hello 
LINQ 
world

Sintassi di LINQ

Esistono due sintassi di LINQ. Questi sono i seguenti.

Sintassi Lamda (metodo)

var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

Sintassi della query (comprensione)

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

Tipi di LINQ

I tipi di LINQ sono menzionati di seguito in breve.

  • LINQ to Objects
  • LINQ to XML (XLINQ)
  • LINQ to DataSet
  • LINQ to SQL (DLINQ)
  • LINQ to Entities

Oltre a quanto sopra, esiste anche un tipo LINQ denominato PLINQ che è il LINQ parallelo di Microsoft.

Architettura LINQ in .NET

LINQ ha un'architettura a 3 livelli in cui il livello superiore è costituito dalle estensioni del linguaggio e il livello inferiore è costituito da origini dati che sono in genere oggetti che implementano interfacce generiche IEnumerable <T> o IQueryable <T>. L'architettura è mostrata di seguito.

Espressioni di query

L'espressione di query non è altro che una query LINQ, espressa in una forma simile a quella di SQL con operatori di query come Select, Where e OrderBy. Le espressioni di query di solito iniziano con la parola chiave "Da".

Per accedere agli operatori di query LINQ standard, lo spazio dei nomi System.Query deve essere importato per impostazione predefinita. Queste espressioni vengono scritte all'interno di una sintassi di query dichiarativa che era C # 3.0.

Di seguito è riportato un esempio per mostrare un'operazione di query completa che consiste nella creazione di origini dati, definizione di espressioni di query ed esecuzione di query.

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class LINQQueryExpressions {
      static void Main() {
      
         // Specify the data source.
         int[] scores = new int[] { 97, 92, 81, 60 };

         // Define the query expression.
         IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;

         // Execute the query.
		 
         foreach (int i in scoreQuery) {
            Console.Write(i + " ");
         }
		 
         Console.ReadLine();
      }
   }
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

97 92 81

Metodi di estensione

Introdotti con .NET 3.5, i metodi di estensione sono dichiarati solo nelle classi statiche e consentono l'inclusione di metodi personalizzati negli oggetti per eseguire alcune operazioni di query precise per estendere una classe senza essere un membro effettivo di quella classe. Anche questi possono essere sovraccaricati.

In poche parole, i metodi di estensione vengono utilizzati per tradurre espressioni di query in chiamate di metodi tradizionali (orientate agli oggetti).

Differenza tra LINQ e Stored procedure

Esiste una serie di differenze esistenti tra LINQ e le stored procedure. Queste differenze sono menzionate di seguito.

  • Le stored procedure sono molto più veloci di una query LINQ poiché seguono un piano di esecuzione previsto.

  • È facile evitare errori di runtime durante l'esecuzione di una query LINQ rispetto a una stored procedure poiché la prima ha il supporto Intellisense di Visual Studio e il controllo completo dei tipi durante la compilazione.

  • LINQ consente il debug facendo uso del debugger .NET che non è nel caso delle stored procedure.

  • LINQ offre supporto per più database in contrasto con le stored procedure, dove è essenziale riscrivere il codice per diversi tipi di database.

  • La distribuzione della soluzione basata su LINQ è facile e semplice rispetto alla distribuzione di un set di procedure memorizzate.

Necessità di LINQ

Prima di LINQ, era essenziale apprendere C #, SQL e varie API che uniscono entrambi per formare un'applicazione completa. Da allora, queste fonti di dati e linguaggi di programmazione affrontano una mancata corrispondenza di impedenza; si avverte la necessità di una codifica breve.

Di seguito è riportato un esempio di quante diverse tecniche sono state utilizzate dagli sviluppatori durante l'interrogazione di dati prima dell'avvento di LINQ.

SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;

sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)

È interessante notare che, al di fuori delle righe di codice in primo piano, la query viene definita solo dalle ultime due. Utilizzando LINQ, la stessa query di dati può essere scritta in un formato leggibile con codice colore come il seguente menzionato di seguito anche in un tempo molto minore.

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

Vantaggi di LINQ

LINQ offre una serie di vantaggi e tra questi il ​​primo è la sua potente espressività che consente agli sviluppatori di esprimere in modo dichiarativo. Di seguito vengono forniti alcuni degli altri vantaggi di LINQ.

  • LINQ offre l'evidenziazione della sintassi che si rivela utile per individuare gli errori durante la fase di progettazione.

  • LINQ offre IntelliSense che significa scrivere facilmente query più accurate.

  • La scrittura di codici è molto più veloce in LINQ e quindi anche i tempi di sviluppo vengono ridotti in modo significativo.

  • LINQ semplifica il debug grazie alla sua integrazione nel linguaggio C #.

  • La visualizzazione della relazione tra due tabelle è facile con LINQ grazie alla sua caratteristica gerarchica e questo consente di comporre query unendo più tabelle in meno tempo.

  • LINQ consente l'utilizzo di una singola sintassi LINQ durante l'esecuzione di query su molte origini dati diverse e ciò è principalmente dovuto alla sua base unitiva.

  • LINQ è estensibile, il che significa che è possibile utilizzare la conoscenza di LINQ per eseguire query su nuovi tipi di origini dati.

  • LINQ offre la possibilità di unire diverse origini dati in una singola query e di suddividere problemi complessi in un set di query brevi di facile debug.

  • LINQ offre una facile trasformazione per la conversione di un tipo di dati in un altro, come la trasformazione dei dati SQL in dati XML.