LINQ est un vaste ensemble de technologies, basées notamment sur une syntaxe de compréhension des requêtes, par exemple :
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
qui est mappé par le compilateur en code :
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
et ici le réel La magie opère. Notez que nous n'avons pas dit ce que Foo
est ici - et le compilateur ne s'en soucie pas ! Tant qu'il peut résoudre un peu de méthode appropriée appelée Where
qui peut prendre un lambda, et le résultat de cela a un peu de Select
qui peut accepter le lambda, il est heureux.
Considérons maintenant que le lambda peut être compilé soit dans une méthode anonyme (délégué, pour LINQ-to-Objects, qui inclut LINQ-to-DataSet), ou à un arbre d'expression (un modèle d'exécution qui représente le lambda dans un modèle objet).
Pour les données en mémoire (généralement IEnumerable<T>
), il exécute simplement le délégué - c'est parfait et rapide. Mais pour IQueryable<T>
la représentation-objet de l'expression (a LambdaExpression<...>
), il peut le démonter et l'appliquer à n'importe quel exemple de "LINQ-to-Something".
Pour les bases de données (LINQ-to-SQL, LINQ-to-Entities), cela peut signifier écrire TSQL, par exemple :
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Mais cela pourrait (pour les services de données ADO.NET, par exemple) signifier écrire une requête HTTP.
L'exécution d'une requête TSQL bien écrite qui renvoie une petite quantité de données est plus rapide que le chargement d'une base de données entière sur le réseau, puis le filtrage sur le client. Dans les deux cas, il existe des scénarios idéaux et des scénarios tout à fait erronés.
L'objectif et l'avantage ici sont de vous permettre d'utiliser une syntaxe unique, vérifiée statiquement, pour interroger un large éventail de sources de données, et de rendre le code plus expressif (le code "traditionnel" pour regrouper des données, par exemple, n'est pas très clair en termes de ce qu'il essaie de faire - il est perdu dans la masse du code).