LINQ est un large ensemble de technologies, basé sur (par exemple) une syntaxe de compréhension de requête, 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 la vraie magie commence. Notez que nous n'avons pas dit ce qu'il Foo
y a ici - et le compilateur s'en fiche! Tant qu'il peut résoudre une méthode appropriée appelée Where
qui peut prendre un lambda, et que le résultat de cela a une Select
méthode qui peut accepter le lambda, il est heureux.
Considérez 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), soit dans un expression-tree (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é - très bien et rapidement. Mais pour IQueryable<T>
la représentation objet de l'expression (a LambdaExpression<...>
), elle peut la séparer et l'appliquer à n'importe quel exemple "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 ADO.NET Data Services, 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 au niveau du client. Les deux ont des scénarios idéaux et des scénarios tout à fait faux, cependant.
L'objectif et l'avantage ici est de vous permettre d'utiliser une seule syntaxe vérifiée de manière statique 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).