LINQ - Aperçu

Les développeurs du monde entier ont toujours rencontré des problèmes lors de l'interrogation des données en raison de l'absence de chemin défini et du besoin de maîtriser plusieurs technologies comme SQL, les services Web, XQuery, etc.

Introduit dans Visual Studio 2008 et conçu par Anders Hejlsberg, LINQ (Language Integrated Query) permet d'écrire des requêtes même sans la connaissance des langages de requête comme SQL, XML, etc. Les requêtes LINQ peuvent être écrites pour divers types de données.

Exemple de requête 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

Lorsque le code ci-dessus de C # ou VB est compilé et exécuté, il produit le résultat suivant -

hello 
LINQ 
world

Syntaxe de LINQ

Il existe deux syntaxes de LINQ. Ce sont les suivants.

Syntaxe Lamda (méthode)

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

Syntaxe de requête (compréhension)

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

Types de LINQ

Les types de LINQ sont mentionnés ci-dessous en bref.

  • LINQ aux objets
  • LINQ vers XML (XLINQ)
  • LINQ vers DataSet
  • LINQ vers SQL (DLINQ)
  • LINQ vers les entités

En dehors de ce qui précède, il existe également un type LINQ nommé PLINQ qui est le LINQ parallèle de Microsoft.

Architecture LINQ dans .NET

LINQ a une architecture à 3 couches dans laquelle la couche supérieure se compose des extensions de langage et la couche inférieure se compose de sources de données qui sont généralement des objets implémentant des interfaces génériques IEnumerable <T> ou IQueryable <T>. L'architecture est illustrée ci-dessous.

Expressions de requête

L'expression de requête n'est rien d'autre qu'une requête LINQ, exprimée sous une forme similaire à celle de SQL avec des opérateurs de requête tels que Select, Where et OrderBy. Les expressions de requête commencent généralement par le mot-clé "De".

Pour accéder aux opérateurs de requête LINQ standard, l'espace de noms System.Query doit être importé par défaut. Ces expressions sont écrites dans une syntaxe de requête déclarative qui était C # 3.0.

Vous trouverez ci-dessous un exemple pour montrer une opération de requête complète qui comprend la création d'une source de données, la définition d'une expression de requête et l'exécution de la requête.

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();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

97 92 81

Méthodes d'extension

Introduites avec .NET 3.5, les méthodes d'extension sont déclarées uniquement dans des classes statiques et permettent l'inclusion de méthodes personnalisées aux objets pour effectuer des opérations de requête précises pour étendre une classe sans être un membre réel de cette classe. Ceux-ci peuvent également être surchargés.

En un mot, les méthodes d'extension sont utilisées pour traduire les expressions de requête en appels de méthode traditionnels (orientés objet).

Différence entre LINQ et procédure stockée

Il existe un éventail de différences entre les procédures LINQ et stockées. Ces différences sont mentionnées ci-dessous.

  • Les procédures stockées sont beaucoup plus rapides qu'une requête LINQ car elles suivent un plan d'exécution attendu.

  • Il est facile d'éviter les erreurs d'exécution lors de l'exécution d'une requête LINQ que par comparaison avec une procédure stockée, car la première prend en charge Intellisense de Visual Studio ainsi qu'une vérification de type complet pendant la compilation.

  • LINQ permet le débogage en utilisant le débogueur .NET, ce qui n'est pas le cas des procédures stockées.

  • LINQ offre la prise en charge de plusieurs bases de données contrairement aux procédures stockées, où il est essentiel de réécrire le code pour divers types de bases de données.

  • Le déploiement d'une solution basée sur LINQ est facile et simple par rapport au déploiement d'un ensemble de procédures stockées.

Besoin de LINQ

Avant LINQ, il était essentiel d'apprendre C #, SQL et diverses API qui lient les deux pour former une application complète. Depuis, ces sources de données et langages de programmation sont confrontés à un décalage d'impédance; un besoin de codage court se fait sentir.

Vous trouverez ci-dessous un exemple du nombre de techniques différentes utilisées par les développeurs lors de l'interrogation d'une donnée avant l'avènement de 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)

Fait intéressant, parmi les lignes de code présentées, la requête n'est définie que par les deux dernières. En utilisant LINQ, la même requête de données peut être écrite sous une forme de code couleur lisible comme la suivante mentionnée ci-dessous également en très moins de temps.

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

Avantages de LINQ

LINQ offre une foule d'avantages et parmi eux, le principal est sa puissante expressivité qui permet aux développeurs de s'exprimer de manière déclarative. Certains des autres avantages de LINQ sont indiqués ci-dessous.

  • LINQ propose une coloration syntaxique qui s'avère utile pour détecter les erreurs lors de la conception.

  • LINQ propose IntelliSense, ce qui signifie écrire facilement des requêtes plus précises.

  • L'écriture des codes est assez rapide dans LINQ et donc le temps de développement est également considérablement réduit.

  • LINQ facilite le débogage grâce à son intégration dans le langage C #.

  • L'affichage des relations entre deux tables est facile avec LINQ en raison de sa fonction hiérarchique, ce qui permet de composer des requêtes joignant plusieurs tables en moins de temps.

  • LINQ permet l'utilisation d'une seule syntaxe LINQ lors de l'interrogation de nombreuses sources de données diverses, principalement en raison de sa base unitive.

  • LINQ est extensible, ce qui signifie qu'il est possible d'utiliser la connaissance de LINQ pour interroger de nouveaux types de sources de données.

  • LINQ offre la possibilité de joindre plusieurs sources de données en une seule requête et de décomposer des problèmes complexes en un ensemble de requêtes courtes faciles à déboguer.

  • LINQ offre une transformation facile pour la conversion d'un type de données en un autre, comme la transformation de données SQL en données XML.