2009-12-27 9 views
2

Je suis un peu confus ce que l'interface IQueryable représente réellement.Est-ce qu'une requête IQueryable ou juste un objet peut être interrogé?

La documentation MSDN pour IQueryable indique: "Fournit des fonctionnalités à évaluer les requêtes par rapport à une source de données spécifique."

La documentation pour IQueryProvider indique: "Définit des méthodes pour créer et exécuter des requêtes décrites par un objet IQueryable."

Le nom et le résumé de la documentation suggèrent qu'il s'agit d'un objet/magasin de données qui peut être interrogé. La deuxième citation et le fait que la classe ObjectQuery de Entity Framework implémente IQueryable suggèrent que c'est une requête qui peut être exécutée. Est-ce que j'ai mal compris quelque chose ou est-ce que c'est vraiment un peu flou?

+0

Avez-vous essayé de lire la section "Remarques" de l'interface IQueryable? Il a des informations et des explications supplémentaires. –

Répondre

2

Un IQueryable représente la requête elle-même. Une source de données lui sera associée, mais ce n'est pas le magasin de données lui-même. En particulier, il n'aura généralement pas toutes les données en mémoire.

Vous pouvez peut-être penser un peu comme un objet SqlCommand - il a la requête, il sait quoi demander pour les données, mais il ne contient pas les données lui-même.

+0

Mais pourquoi s'appelle-t-on alors IQueryable? C'est la source principale de ma confusion. IQuery serait un nom plus approprié alors. – Albic

+0

@Albic: Je ne sais pas sur le front de nommage, j'ai peur. –

1

Un IQueryable représente une source sur laquelle des requêtes peuvent être exécutées. Il peut s'agir d'une représentation d'une table sur un serveur SQL ou d'une collection d'objets en mémoire.

Un IQueryProvider représente un objet qui peut créer et exécuter des requêtes comme représenté par des arbres d'expression. Le fournisseur de requêtes LINQ-to-SQL, par exemple, prendra des arbres d'expression et renverra un IQueryable qui vous permet d'énumérer (pour obtenir les résultats) ou d'affiner (en composant des requêtes) avant d'énumérer.

Il ya un très bon walkthrough sur MSDN sur la création de votre propre IQueryProvider. Je pense que si vous faites cette procédure, vous comprendrez beaucoup mieux.

+0

Et l'expression représente la requête elle-même, non? En revanche, la méthode IQueryProvider.CreateQuery renvoie une valeur IQueryable . Cette dénomination incohérente me confond. – Albic

1

Un IQueryable représente deux choses (sans doute très distinctes). Il représente une requête, sous la forme d'une référence à une arborescence d'expression décrivant du code, et une source de données, sous la forme d'une référence à un "fournisseur" qui sait comment exécuter la requête.

Je pense que la source de votre confusion vient du fait que les docs ne peuvent parler que des méthodes définies par IQueryable. La plus grande partie de la puissance de IQueryable provient de l'implémentation de ses méthodes d'extension associées définies dans la classe Queryable, mais elles ne font pas strictement partie de l'interface IQueryable.

Intéressant!

Mise à jour: En relisant votre question, un autre aperçu utile est qu'une requête est elle-même queryable. C'est la clé pour activer la compositionnalité dans LINQ. Donc, un IQueryable est une requête, et il est interrogeable - donc il n'y a pas de contradiction dans le nom du type.