Repositorio / IQueryable / Objeto de consulta

Estoy creando un repositorio y he visto en muchos lugares 2 razones para no exponer IQueryable fuera del repositorio.

1) La primera es porque diferentes proveedores de LINQ podrían comportarse de manera diferente, y esta diferencia debe estar contenida dentro del repositorio.

2) El segundo es evitar que los desarrolladores de nivel de servicio modifiquen la consulta de la base de datos de manera que accidentalmente cause problemas de rendimiento.

¿Supongo que el problema 2 solo se puede evitar manteniendo toda la lógica de consulta dentro del repositorio y no permitiendo ninguna forma de creación de consultas externas? Pero eso me parece poco práctico.

El problema 1 parece resolverse utilizando el patrón de objeto de datos.

p.ej.public IEnumerable<T> FindBy(Query query)

Mi pregunta es, ¿por qué no solo pasaría una expresión lambda, ya que es independiente del proveedor, parece que me proporciona la misma funcionalidad que un objeto de consulta y el mismo nivel de separación?

p.ej.public IEnumerable<T> FindBy(Expression<Func<T,bool>> predicate)

¿Hay alguna razón para no hacer esto? ¿Se rompen algunas reglas? ¿Mejores prácticas? que debo saber?

Respuestas a la pregunta(2)

Su respuesta a la pregunta