2016-08-09 2 views
0

J'ai une certaine confusion: Dans Linq-to-Object, nous travaillons sur des données en mémoire pour exécuter une requête LINQ qui est traitée par le langage C#.LINQ-to-Object est un fournisseur LINQ?

Lorsque j'écris une requête Linq exécutée sur des données en mémoire, pourquoi utilisons-nous le fournisseur (LINQ-to-Object)?

Répondre

2

Non, Linq to Object N'EST PAS UN FOURNISSEUR et n'a pas à relayer sur un autre fournisseur intermédiaire pour exécuter la requête (linq to object). Pour le comprendre plus clairement, nous devons comprendre ce qu'est réellement le fournisseur. Le fournisseur est essentiellement l'implémentation qui implémente l'interface IQueryProvider et IQueryable et cela traduit principalement votre requête linq à QUELQUE CHOSE que votre fournisseur comprend. Par exemple, lorsque vous optez pour LINQ to SQL interroge vos requêtes converties/traduites en SQL, il est traduit en SQL car votre fournisseur (dans ce cas) ne comprend que SQL. Lorsque vous exécutez une requête sur la collecte de données In-Memory, C# n'a pas à traduire votre requête linq en une autre requête. Comme @Stilgar mentionne "Les fournisseurs sont utilisés lorsque la source est IQueryable"

Lorsque vous travaillez sur des données In-Memory, votre source est essentiellement IEnumerable.

2

LINQ to Objects n'est pas un fournisseur LINQ. C'est une implémentation de l'API LINQ sur IEnumerable. L'API LINQ peut être implémentée sur pratiquement n'importe quel type, à condition de nommer correctement vos méthodes et d'accepter les arguments appropriés. Cela étant dit, il y a quelque chose de très proche d'un fournisseur LINQ lié à LINQ to Objects. Les fournisseurs sont utilisés lorsque la source est IQueryable et que le compilateur génère une arborescence d'expression. Un arbre d'expression peut être compilé à un délégué de sorte que la méthode Compile agit comme quelque chose de très similaire à un fournisseur LINQ.

Notez également que dans la pratique "Fournisseur LINQ" est souvent utilisé pour indiquer simplement une implémentation de l'API LINQ. C'est un peu similaire à la façon dont "argument" et "paramètre" sont utilisés de façon interchangeable malgré la petite différence.