2012-02-07 13 views

Respuesta

49

IQueryable objetos son producidos por proveedores queryable (por ejemplo, LINQ to SQL, LINQ to Entities/Entity Framework, etc.). Prácticamente nada de lo que pueda crear instancias con new en el .NET Framework básico implementa IQueryable.

IQueryable es una interfaz diseñada para ser utilizada para crear proveedores consultable, que permiten que la biblioteca de LINQ a ser aprovechada en un almacén de datos externo mediante la construcción de un árbol de análisis sintáctico-expresión capaz. Por naturaleza, los Queryables requieren un contexto: información con respecto a qué es exactamente lo que está consultando. Usar new para crear cualquier tipo de IQueryable, independientemente de si es posible, no te lleva muy lejos.

Dicho esto, cualquier IEnumerable se puede convertir en IQueryable utilizando el método de extensión AsQueryable(). Esto crea un constructo diferente superficialmente similar, pero funcionalmente muy detrás de las escenas como cuando se usan métodos LINQ contra un objeto simple IEnumerable. Esta es probablemente la fuente más abundante de consultas a las que tiene acceso sin configurar un proveedor de IQueryable real. Este cambio es muy útil para probar los algoritmos basados ​​en LINQ ya que no necesita el almacén de datos real, solo una lista de datos en memoria que pueden imitarlo.

+2

Gracias. Su escenario descrito (prueba de unidad) es más o menos lo que estoy haciendo. ¿Conoces alguna buena documentación sobre las diferencias de construcción que mencionas? Tengo curiosidad por saber qué tan diferente es el objeto cuando se utiliza el método de extensión 'AsQueryable()'. –

+5

Es MUY diferente. En lugar de una cadena de objetos Iterator producidos por los métodos IEnumerable Linq, los métodos IQueryable agregan nodos a un árbol de Expresión. Este árbol no es, por sí mismo, ejecutable como un código como un iterador. Pero, es serializable, analizable, etc. por lo que puede determinar la estructura de la consulta y convertirla en una consulta en otro idioma como SQL. – KeithS

+0

Mire esta pregunta y todos los enlaces relacionados: http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet – KeithS

2

bien, su pregunta es un poco extraño ... pero creen que si nos fijamos en una interfaz en Reflector, que le dará una lista de los ejecutores en los ensamblados cargados.

Como descargo de responsabilidad no he utilizado Reflector ya que fue pago por jugar, así que podría estar equivocado.

3

EntityCollection hace, al igual que EnumerableQuery.

No es que creo que ninguno de estos te vaya a llevar a ninguna parte. Para ayudar, necesitamos saber lo que realmente está tratando de resolver. Si está escribiendo un proveedor de LINQ, debe leer esto: http://msdn.microsoft.com/en-us/library/bb546158.aspx.

Recomiendan escribir su propia implementación.

+0

Gracias. Perdón por la confusión en la publicación inicial; No busco ayuda con mi código, solo estoy aprendiendo nuevos objetos C# para jugar. –

+0

No veo que EntityCollection implemente IQueryable en ninguna parte ... –

Cuestiones relacionadas