Le but d'un fournisseur de Linq est de "traduire" les arbres d'expression Linq (qui sont construits derrière les coulisses d'une requête) dans le langage de requête natif de la source de données. Dans les cas où les données sont déjà en mémoire, vous n'avez pas besoin d'un fournisseur Linq; Linq 2 Objects est très bien. Cependant, si vous utilisez Linq pour parler à un magasin de données externe comme un SGBD ou un nuage, c'est absolument essentiel. Le principe de base de toute structure d'interrogation est que le moteur de la source de données doit faire le plus de travail possible et ne renvoyer que les données dont le client a besoin. Cela est dû au fait que la source de données est supposée savoir le mieux comment gérer les données qu'elle stocke et parce que le transport de données sur le réseau est relativement coûteux en termes de temps et doit donc être minimisé. Maintenant, en réalité, cette deuxième partie est "retourner seulement les données demandées par le client"; le serveur ne peut lire l'esprit de votre programme et sait de quoi il a vraiment besoin; il ne peut que donner ce qu'on lui demande. Voici où un fournisseur Linq intelligent souffle absolument une implémentation "naïve". En utilisant le côté IQueryable de Linq, qui génère des arbres d'expression, un fournisseur Linq peut traduire l'arbre d'expression en une instruction SQL que le SGBD utilisera pour renvoyer les enregistrements demandés par le client dans l'instruction Linq. Une implémentation naïve nécessiterait de récupérer TOUS les enregistrements en utilisant une instruction SQL large, afin de fournir une liste d'objets en mémoire au client, puis tout le travail de filtrage, de groupage, de tri, etc. est effectué par le client. Par exemple, supposons que vous utilisiez Linq pour obtenir un enregistrement d'une table dans le DB à l'aide de sa clé primaire. Un fournisseur Linq peut traduire dataSource.Query<MyObject>().Where(x=>x.Id == 1234).FirstOrDefault()
dans "SELECT TOP 1 * de MyObjectTable WHERE Id = 1234". Cela renvoie zéro ou un enregistrements.Une implémentation "naïve" enverrait probablement au serveur la requête "SELECT * FROM MyObjectTable", puis utiliserait le côté IEnumerable de Linq (qui fonctionne sur les classes en mémoire) pour faire le filtrage. Dans une déclaration, vous vous attendez à produire des résultats 0-1 sur une table avec 10 millions d'enregistrements, lesquels d'entre vous pourraient faire le travail plus rapidement (ou même travailler du tout, sans manquer de mémoire)?
Je ne sais pas pourquoi linq-to-excel profite de IQueryable, mais il y a des cas où le code est beaucoup plus rapide. – CodesInChaos