¿Cómo transfiere la ejecución de una Expresión creada por un objeto IQueryable a un IEnumerable?

StackOverflow https://stackoverflow.com/questions/503208

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
    }
¿Fue útil?

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<>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top