Pregunta

Por favor, perdóname si no estoy claro, estoy comenzando con expresiones nHibernate/Linq/lambda, y en realidad no estoy seguro de qué buscar ...

He estado trabajando con .NET 2.0 durante los últimos 4 o 5 años y no tuve la oportunidad de evolucionar aparte de mí mismo, por lo que ahora voy a aprender nueva tecnología :)

He estado leyendo muchos blogs y publicaciones y comencé un pequeño proyecto personal donde trato de usar el patrón de repositorio lo mejor posible.

Ahora estoy en la siguiente situación:

  • Myproject.core.dll: Tengo este ensamblaje central que contiene toda la lógica de negocios y establece el contrato de IrePository. No sabe nada de la implementación real del repositorio, se resuelve en el tiempo de ejecución usando el COI, por lo que esta DLL central no tiene referencia a las DLL nHibernate.
  • Myproject.data.nHibernate.dll: La implementación del repositorio está contenida dentro de este ensamblaje que tiene todas las referencias necesarias a las DLL nHibernate.

La implementación de mi repositorio se parece a esto:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    ...
    public virtual IQueryable<T> All()
    {
        IList<T> entities = Session
            .CreateCriteria( typeof( T ) )
            .List<T>();
        return entities.AsQueryable<T>();
    }
    ...
}

Entonces, en mi central dll, puedo obtener una referencia a mi repositorio y hacer algo como:

IList<Person> people = myRepository.All().ToList();

Eso parece funcionar bien, consulta la base de datos y devuelve todas las filas de la tabla de personas.

Sin embargo, ahora lo que quiero hacer es agregar predicados:

IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList();

Esto funciona bien, pero, por supuesto, lo que sucede es que NHibernate primero consulta la base de datos para devolver todas las filas, y luego LINQ filtra los resultados para que solo devuelvan los cuyo nombre es "Dave".

He estado buscando en todo Internet, pero no he encontrado cómo implementar esto, también encontré muchas cosas que parecen estar desactualizadas, por ejemplo, a menudo vi llamadas al método NH Session.linq (), I Miré en todo mi DLL, este método no se encuentra en ninguna parte ...

Si alguien pudiera señalarme la dirección correcta, tal vez con un pequeño ejemplo o algo así, estaría muy agradecido.

¡Muchas gracias!

¿Fue útil?

Solución

Es bastante simple:

Usar session.Query<T>():

public virtual IQueryable<T> All()
{
    return Session.Query<T>();
}

Query<T> es un método de extensión que vive en el espacio de nombres NHibernate.Linq.

session.Linq ya no es compatible. Fue el proveedor de LINQ para nHibernate antes de la versión 3 y ha sido reemplazado por Query<T>.

Otros consejos

Es posible que desee mirar el uso del patrón de especificación con su repositorio. Hay un ejemplo de implementación con nHibernate aquí del libro de cocina NHibernate 3.0, que es un excelente recurso que vale la pena obtener.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top