¿Cómo transfiere la ejecución de una Expresión creada por un objeto IQueryable a un IEnumerable?
-
20-08-2019 - |
Pregunta
En mi código me gustaría hacer que mis repositorios sean IQueryable. De esta manera, los criterios para la selección serán un árbol de expresiones linq.
Ahora, si quiero burlarme de mi repositorio en teoría, esto es muy fácil: simplemente implemente la interfaz de mi repositorio (que también es un objeto IQueryable).
La implementación de mi repositorio simulado sería solo en una colección de memoria, pero mi pregunta es: ¿Conoces una manera fácil de implementar la interfaz IQueryable de mi simulacro, para transferir la consulta a mi colección en memoria (IEnumerable)?
Gracias por su respuesta,
Alguna precisión
El objeto cliente de mi repositorio usará mi repositorio de esta manera:
var result = from entry en MyRepository donde entry.Product == " SomeProduct " seleccionar entrada;
Lo que hace ToList o AsEnumerable es ejecutar la consulta y devolver el resultado como una Lista o como IEnumerable. Pero tengo que implementar la interfaz IQueryable en mi repositorio, con un IQueryProvider que transforma la expresión en una llamada a un objeto IEnumerable.
Solución
La implementación de la solución es delegar la llamada a IQueryable a mi colección inmemory con AsQueryable.
public class MockRepository : IQueryable<DomainObject>
{
private List<DomainObject> inMemoryList = new List<DomainObject>();
#region IEnumerable<DomainObject> Members
public IEnumerator<DomainObject> GetEnumerator()
{
return inMemoryList.GetEnumerator();
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return inMemoryList.GetEnumerator();
}
#endregion
#region IQueryable Members
public Type ElementType
{
get
{
return inMemoryList.AsQueryable().ElementType;
}
}
public Expression Expression
{
get
{
return inMemoryList.AsQueryable().Expression;
}
}
public IQueryProvider Provider
{
get
{
return inMemoryList.AsQueryable().Provider;
}
}
#endregion
}
Solución
Use AsQueryable en sus simulacros. Ahora son consultables y puede tratarlos como cualquier otro consultable.
Otros consejos
¿Puedes usar el método de extensión?
.ToList<>