¿El propósito es AsQueryable()
solo para que pueda pasar un IEnumerable
a métodos que podrían esperar IQueryable
, o hay una razón útil para representar IEnumerable
como IQueryable
? Por ejemplo, se supone que debe ser para casos como este:
IEnumerable<Order> orders = orderRepo.GetAll();
// I don't want to create another method that works on IEnumerable,
// so I convert it here.
CountOrders(orders.AsQueryable());
public static int CountOrders(IQueryable<Order> ordersQuery)
{
return ordersQuery.Count();
}
¿O realmente lo hace hacer algo diferente?
IEnumerable<Order> orders = orderRepo.GetAll();
IQueryable<Order> ordersQuery = orders.AsQueryable();
IEnumerable<Order> filteredOrders = orders.Where(o => o.CustomerId == 3);
IQueryable<Order> filteredOrdersQuery = ordersQuery.Where(o => o.CustomerId == 3);
// Are these executed in a different way?
int result1 = filteredOrders.Count();
int result2 = filteredOrdersQuery.Count();
¿Las IQueryable
versiones de estos métodos de extensión simplemente crean una expresión que termina haciendo lo mismo una vez que se ejecuta? Mi pregunta principal es, ¿cuál es un caso de uso real para usar AsQueryable
?
fuente
IQueryable<T>
deriva deIEnumerable<T>
, ¿puede explicar lo que quiere decir con "IQueryable no enumerable"?IQueryable
que es más que un paqueteIEnumerable
, y que en realidad aprovecha las capacidades adicionales de unIQueryable
.El caso más válido que tengo para AsQueryable es la prueba unitaria. Digamos que tengo el siguiente ejemplo algo artificial
y quiero escribir una prueba unitaria para asegurarme de que el controlador devuelve los resultados devueltos desde el repositorio. Se vería algo como esto:
donde realmente, todo lo que el método AsQueryable () me permite hacer es satisfacer al compilador al configurar un simulacro.
Sin embargo, me interesaría dónde se usa esto en el código de la aplicación.
fuente
Como señaló sanjuro, el propósito de AsQueryable () se explica en Uso de AsQueryable con Linq To Objects y Linq To SQL . En particular, el artículo dice:
fuente
El propósito de AsQueryable () se explica en gran medida en este artículo Uso de AsQueryable con Linq To Objects y Linq To SQL
De la sección Comentarios del método MSDN Queryable.AsQueryable:
Eso es exactamente lo que se menciona y se usa en el artículo anterior. En su ejemplo, depende de qué es orderRepo.GetAll regresando, IEnumerable o IQueryable (Linq to Sql). Si devuelve IQueryable, el método Count () se ejecutará en la base de datos; de lo contrario, se ejecutará en la memoria. Mire cuidadosamente el ejemplo en el artículo de referencia.
fuente
IQueryable
Documentación de cotización de interfaz :Entonces, para alguien que tiene la intención de hacer que su estructura de datos sea consultable en .NET, esa estructura de datos que no es necesaria puede ser enumerada o tener un enumerador válido .
IEnumerator
es una interfaz para iterar y procesar el flujo de datos .fuente
IQueryable
yIEnumerable
, pero no entiendo el caso de uso delAsQueryable
método de extensión. Sin embargo, me estoy tropezando un poco con esa oración, que sospecho que podría tener la respuesta que estoy buscando (según los votos a favor).AsQueryable()
?" Si estoy comenzando con un IEnumerable (algo que ya es capaz de proporcionar una capacidad de enumeración), ¿por qué tendría que convertir paraIQueryable
usar el método de extensiónAsQueryable()
? ¿Quizás un pequeño ejemplo de código para ilustrar dónde sería útil esto? Parece que me falta algo en tu explicación. Gracias por tu tiempo.linq to sql
,linq to xml
y entonces ... si desea escribir unlinq
controlador que se dirija a sus estructuras de datos (linq to your data
), para que los usuarios de su api tengan la posibilidad de ejecutarlinq
consultas en sus estructuras de datos, debe elegirIQueryable
IQueryable
yIEnumerable
. Sé la diferencia y no es eso lo que estoy pidiendo. Estoy preguntando por qué alguien querría tener algo que implementaIEnumerable
, y convertirla en unaIQueryable
utilizando elAsQueryable
método de extensión. ¿Eso es lo que estás respondiendo? Todavía no puedo decir ...