Qu'est-ce que LINQ et que fait-il? [fermé]

126

Qu'est-ce que LINQ? Je sais que c'est pour les bases de données, mais que fait-il?

Kredns
la source
20
Je crois que j'ai vaincu le critère «sans réponse raisonnable». Il n'y a aucune raison pour que cette question soit close.
Amy B
1
Écoutez le créateur de LINQ, Erik Meijer, dire ce que c'est. BTW, ce n'est pas uniquement pour la base de données.
Sнаđошƒаӽ

Réponses:

171

LINQ est l' acronyme de Language Integrated Query .

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

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

  • LINQ To Objects - examinez System.Linq.Enumerable pour les méthodes de requête. Ces cibles IEnumerable<T>, permettant à toute collection bouclable typée d'être interrogée d'une manière sûre pour le type. Ces requêtes reposent sur des méthodes .NET compilées, pas sur des expressions.

  • LINQ To Anything - examinez System.Linq.Queryable pour certaines méthodes de requête. Celles-ci ciblent IQueryable<T>, permettant la construction d'arbres d'expression qui peuvent être traduits par l'implémentation sous-jacente.

  • Arborescences d' expressions - examinez l' espace de noms System.Linq.Expressions . C'est du code sous forme de données. En pratique, vous devez être conscient de ce genre de choses, mais vous n'avez pas vraiment besoin d'écrire du code sur ces types. Les fonctionnalités de langage (telles que les expressions lambda) peuvent vous permettre d'utiliser divers raccourcis pour éviter de traiter directement ces types.

  • LINQ To SQL - examinez l' espace de noms System.Data.Linq . Notez en particulier le DataContext. Il s'agit d'une technologie DataAccess créée par l'équipe C #. Cela fonctionne juste.

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

  • LINQ To XML - examinez l' espace de noms System.Xml.Linq . Essentiellement, les gens n'étaient pas satisfaits du contenu System.Xml. Microsoft l'a donc réécrit et a profité de la réécriture pour introduire des méthodes qui facilitent l'utilisation de LINQ To Objects contre XML.

  • Quelques bons types d'aide, tels que Func et Action . Ces types sont des délégués avec un support générique. Il est révolu le temps de déclarer vos propres types de délégués personnalisés (et non interchangeables).

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


Ok, passons aux fonctionnalités linguistiques. Je vais m'en tenir à C #, car c'est ce que je connais le mieux. VB.NET avait également plusieurs améliorations similaires (et quelques-unes que C # n'a pas obtenu - les littéraux XML). Ceci est une liste courte et incomplète.

  • Méthodes d'extension - cela vous permet "d'ajouter" une méthode à taper. La méthode est en réalité une méthode statique à laquelle une instance du type est passée et 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 (entièrement implémenté ) méthodes d'assistance aux interfaces.

  • Syntaxe de compréhension de requête - cela vous permet d'écrire dans une structure semblable à SQL. Tout cela est traduit en méthodes sur System.Linq.Queryable ou System.Linq.Enumerable (selon le type de myCustomers). Il est complètement facultatif et vous pouvez bien utiliser LINQ sans lui. Un avantage de ce style de déclaration de requête est que les variables de plage ont une portée: elles n'ont pas besoin d'être re-dé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 chacun en une méthode anonyme ou un vrai 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 a 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 a suffisamment d'informations à partir d'une initialisation pour qu'il puisse déterminer le type pour vous. Vous pouvez demander au compilateur de le faire en utilisant le mot clé var. Un typage implicite est nécessaire pour déclarer des variables pour les types anonymes, car les programmeurs ne peuvent pas utiliser le nom d'un type anonyme .

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

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

  • une bibliothèque pour la manipulation de collections et d'itérateurs qui utilise largement les fonctions d'ordre supérieur comme arguments (System.Linq)

  • une bibliothèque pour passer et manipuler des fonctions simples sous forme d'arbres de syntaxe abstraite (System.Linq.Expressions)

  • une extension de syntaxe à divers langages pour fournir une syntaxe plus semblable à SQL pour le traitement des collections, une notation plus compacte pour les fonctions anonymes et un mécanisme pour introduire des fonctions d'assistance statiques syntaxiquement impossibles à distinguer des fonctions membres finales

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

Les composants peuvent être utilisés isolément ou combinés.

Jeffrey Hantin
la source
10

En un mot, LINQ (Language-Integrated Query) vous permet d'écrire des requêtes directement dans votre code. Ces requêtes peuvent concerner des bases de données relationnelles, mais également des objets conteneur XML ou 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

Vojislav Stojkovic
la source
c'est précis et concis.
SSD
6

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

jcollum
la source
1
Alors, quelle est exactement la différence entre Linq et SQL?
Kredns
Il y a un nom plus sophistiqué pour cela, je pense, mais les structures diffèrent: SQL est Select From Where et LINQ est From Where Select. LINQ est plus facile à utiliser en boucle. LINQ est juste plus facile :) et le SQL qu'il produit est généralement assez bon compte tenu des gains de temps.
jcollum
2
pour être honnête, on pourrait dire que SQL devrait être écrit comme From Where Select, etc.- c'est-à-dire qu'il devrait être écrit de la manière dont l'ensemble de résultats est réellement formé
Don Cheadle
6

LINQ signifie Language Integrated Query , et est un moyen de fournir un mécanisme de «requête» à usage général dans le CLR.

À son niveau le plus élémentaire, il s'agit d'un ensemble de méthodes sur IEnumerable <T> - par exemple, Select, Sum, Where - qui peuvent être utilisées pour les restrictions, les projections, etc. [1]

Pour aller un peu plus loin, LINQ définit également un nouveau modèle de fournisseur LINQ qui peut prendre une arborescence d'expression et l'utiliser pour exécuter des requêtes "natives" sur une source de données en dehors du CLR - par exemple, LINQ to SQL, LINQ to XML, LINQ à NHibernate, etc.

C # et VB.NET ont également défini une syntaxe de requête qui vous permet d'écrire des requêtes fortement typées en ligne (qui ressemble beaucoup à SQL), que le compilateur traduit ensuite en appels IEnumerable <T> équivalents.

Pour moi, la chose la plus intéressante à propos de LINQ est que toutes les fonctionnalités C # et VB.NET nécessaires pour le prendre en charge sont utiles en elles-mêmes. Les méthodes d'extension, les types anonymes, les expressions lambda et le typage implicite étaient tous nécessaires pour prendre en charge LINQ - mais nous avons tendance à utiliser ces fonctionnalités en dehors d'un contexte LINQ pur.

[1] Ce sont des termes relationnels, les programmeurs fonctionnels préféreraient probablement Map, Reduce, Fold, etc.

Mark Brackett
la source
5

LINQ est une technologie d'extraction de données à l'aide d'un idiome dérivé du langage de programmation C #. S'il doit beaucoup à SQL en matière de conception fonctionnelle, il s'agit essentiellement de son propre langage d'interrogation de données. Il fonctionne sur un large spectre de sources de données (bases de données SQL, représentations en mémoire, XML, etc.). LINQ-To-SQL, en particulier, doit être vu comme un contraste avec l'utilisation traditionnelle de l'Embedded SQL qui souffre de ce que l'on appelle souvent une "discordance d'impédance" entre la programmation SQL et la programmation C # / VB.

Pour une discussion sur LINQ et ses limites, vous pouvez jeter un œil à cette question connexe: LINQ to SQL ne manque-t - il pas le point?

Mark Brittingham
la source
0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"Le projet LINQ est le nom de code d'un ensemble d'extensions du .NET Framework qui englobe les opérations de requête, de définition et de transformation intégrées au langage. Il étend C # et Visual Basic avec la syntaxe du langage natif pour les requêtes et fournit des bibliothèques de classes pour tirer parti de ces capacités. "

Jobo
la source
Alors, est-ce pour les bases de données? Car ce que j'ai vu ici (dans SO) ressemble plus à des collections dans l'environnement .net.
OscarRyz