134 votes

Qu'est-ce que LINQ et que fait-il ?

Qu'est-ce que LINQ ? Je sais que c'est pour les bases de données, mais à quoi ça sert ?

24 votes

Je crois que j'ai battu le critère "ne peut pas être raisonnablement répondu". Il n'y a aucune raison pour que cette question soit fermée.

2 votes

Écoutez le créateur de LINQ, Erik Meijer, dire ce que c'est. BTW, c'est no pour la seule base de données.

177voto

David B Points 53123

LINQ signifie Langue Requête intégrée .

Au lieu d'écrire un YAQL (Yet Another Query Language), les développeurs du langage Microsoft ont fourni un moyen d'exprimer les requêtes directement dans leurs langages (tels que C# et Visual Basic). Les techniques d'élaboration de ces requêtes ne dépendent pas des détails d'implémentation de l'objet interrogé, de sorte que vous pouvez écrire des requêtes valides contre de nombreuses cibles (bases de données, objets en mémoire, XML) sans pratiquement tenir compte de la manière sous-jacente dont la requête sera exécutée.

Commençons cette exploration par les parties appartenant au .NET Framework (3.5).

  • LINQ To Objects - examen System.Linq.Enumerable pour les méthodes d'interrogation. Ces cibles IEnumerable<T> permettant d'interroger n'importe quelle collection bouclable typée d'une manière sûre. Ces requêtes reposent sur des méthodes .NET compilées, et non sur des expressions.

  • LINQ To Anything - examen System.Linq.Queryable pour certaines méthodes d'interrogation. Ces cibles IQueryable<T> permettant la construction d'arbres d'expression qui peuvent être traduits par l'implémentation sous-jacente.

  • Arbres d'expression - examiner Expressions System.Linq espace de noms. C'est du code comme des données. En pratique, vous devez être conscient de ces éléments, mais vous n'avez pas vraiment besoin d'écrire du code contre ces types. Les caractéristiques du langage (telles que les expressions lambda) peuvent vous permettre d'utiliser divers raccourcis pour éviter de traiter ces types directement.

  • LINQ To SQL - examiner le System.Data.Linq espace de noms. Notez en particulier le DataContext . Il s'agit d'une technologie DataAccess construite par l'équipe C#. Elle fonctionne tout simplement.

  • LINQ To Entities - examiner le Objets System.Data espace de noms. Notez en particulier le ObjectContext . Il s'agit d'une technologie DataAccess construite par l'équipe ADO.NET. Elle est complexe, puissante et plus difficile à utiliser que LINQ To SQL.

  • LINQ To XML - examiner le System.Xml.Linq espace de noms. Essentiellement, les gens n'étaient pas satisfaits de ce qui se trouvait dans System.Xml . Microsoft l'a donc réécrit et a profité de cette réécriture pour introduire certaines méthodes qui facilitent l'utilisation de LINQ To Objects contre le XML.

  • Quelques types d'aide sympathiques, tels que Func y Action . Ces types sont des délégués avec un support générique. L'époque où il fallait déclarer ses propres types de délégués personnalisés (et non interchangeables) est révolue.

Tout ce qui précède fait partie du cadre .NET et est disponible à partir de n'importe quel langage .NET (VB.NET, C#, IronPython, COBOL .NET, etc.).


Ok, passons aux caractéristiques de la langue. Je vais m'en tenir à C#, puisque c'est ce que je connais le mieux. VB.NET a également apporté plusieurs améliorations similaires (et quelques-unes que C# n'a pas obtenues - les littéraux XML). Cette liste est courte et incomplète.

  • Méthodes d'extension - cela vous permet d'"ajouter" une méthode au type. La méthode est en fait une méthode statique à laquelle on transmet une instance du type, et elle est limitée au contrat public du type, mais elle est très utile pour ajouter des méthodes à des types que vous ne contrôlez pas (chaîne), ou pour ajouter des méthodes d'aide (entièrement implémentées) à des interfaces.

  • Syntaxe de compréhension des requêtes - elle vous permet d'écrire dans une structure de type SQL. Tous ces éléments sont traduits dans les méthodes de System.Linq.Queryable ou System.Linq.Enumerable (selon le type de myCustomers). C'est complètement optionnel et vous pouvez utiliser LINQ sans cela. L'un des avantages de ce style de déclaration de requête est que les variables d'intervalle ont une portée : elles n'ont pas besoin d'être redéclarées pour chaque clause.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Expressions lambda - Il s'agit d'un raccourci pour spécifier une méthode. Le compilateur C# traduira chacune d'entre elles soit en une méthode anonyme, soit en une méthode vraie. System.Linq.Expressions.Expression . Vous devez vraiment les comprendre pour bien utiliser Linq. Il y a trois parties : une liste de paramètres, une flèche et un corps de méthode.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
  • Types anonymes - Parfois, le compilateur dispose de suffisamment d'informations pour créer un type pour vous. Ces types ne sont pas vraiment anonymes : le compilateur les nomme lorsqu'il les crée. Mais ces noms sont créés au moment de la compilation, ce qui est trop tard pour qu'un développeur puisse utiliser ce nom au moment de la conception.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
  • Types implicites - Parfois, le compilateur dispose de suffisamment d'informations provenant d'une initialisation pour déterminer le type à votre place. Vous pouvez demander au compilateur de le faire en utilisant le mot-clé var. Le typage implicite est nécessaire pour déclarer des variables pour les types anonymes, puisque les programmeurs ne peuvent pas utiliser le nom d'un type de variable. anonyme type.

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);

14voto

Jeffrey Hantin Points 19272

LINQ (Language INtegrated Query) peut faire référence à :

  • une bibliothèque pour la manipulation des collections et des itérateurs qui fait un usage intensif des fonctions d'ordre supérieur comme arguments (System.Linq)

  • une bibliothèque pour le passage et la manipulation de fonctions simples sous forme d'arbres syntaxiques abstraits (System.Linq.Expressions)

  • une extension syntaxique à divers langages afin de fournir une syntaxe plus proche de SQL pour le traitement des collections, une notation plus compacte pour les fonctions anonymes et un mécanisme permettant d'introduire des fonctions d'aide statiques syntaxiquement indiscernables des fonctions membres finales

  • une définition d'interface à laquelle les fournisseurs de données peuvent se conformer afin de recevoir la structure de la requête et potentiellement effectuer une optimisation sur celle-ci, ou occasionnellement les fournisseurs de données compatibles eux-mêmes

Les composants peuvent être utilisés de manière isolée ou combinée.

12voto

Vojislav Stojkovic Points 4764

En bref, LINQ (Language-Integrated Query) vous permet d'écrire des requêtes directement dans votre code. Ces requêtes peuvent porter sur des bases de données relationnelles, mais aussi sur XML ou des objets conteneurs en mémoire, tels que des tableaux et des listes. Plus d'informations sont disponibles dans la bibliothèque MSDN : http://msdn.microsoft.com/en-us/library/bb308959.aspx

8voto

jcollum Points 10236

Je vais essayer de donner une réponse simple : LINQ est un moyen pour vous d'interroger votre base de données (ou d'autres bases de données, XML, etc.) en utilisant un langage d'interrogation similaire à SQL mais qui peut être compilé dans une application .NET.

1 votes

Quelle est donc la différence exacte entre Linq et SQL ?

0 votes

Il y a un nom plus sophistiqué pour cela, je pense, mais les structures sont différentes : SQL est Select From Where et LINQ est From Where Select. LINQ est plus facile à utiliser en boucle. LINQ est simplement plus facile :) et le SQL qu'il produit est généralement assez bon compte tenu du gain de temps.

2 votes

Pour être honnête, on pourrait dire que SQL devrait s'écrit comme suit From Where Select, etc. - c'est-à-dire qu'il doit être écrit de la manière dont l'ensemble de résultats est effectivement formé.

6voto

Mark Brittingham Points 18970

LINQ est une technologie d'extraction de données utilisant un idiome dérivé du langage de programmation C#. Bien que sa conception fonctionnelle doive beaucoup à SQL, il s'agit fondamentalement de son propre langage d'interrogation de données. Il fonctionne sur un large éventail de sources de données (bases de données SQL, représentations en mémoire, XML, etc.) LINQ-To-SQL, en particulier, doit être considéré comme un contraste avec l'utilisation traditionnelle de SQL intégré qui souffre de ce qui est souvent appelé un "décalage d'impédance" entre la programmation SQL et la programmation C#/VB.

Pour une discussion sur LINQ et ses limites, vous pouvez jeter un coup d'œil à cette question connexe : LINQ to SQL ne passe-t-il pas à côté de l'essentiel ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X