Hola Germán,

Gracias por la respuesta. Si lo hago así como el tuyo sí que me
funciona, pero lo que pasa es que añado una capa adicional con los
métodos de extensión (es para un framework, así que quiero tener
ciertas consultas prefabricadas) y es ahí donde no me filtra por SQL.

Si hago:

userRepository.FindAll(x => x.Name == "Germán")

Me filtra en la SQL, pero si uso las extensiones...

userRepository.FindAll().WithName("Germán")

Primero me saca todos del SQL y luego me filtra la colección en
memoria.

Mi pregunta era cómo hacer que la consulta no se haga en el FindAll
sino que se haga cuando voy a usar realmente la colección. ¿Usando
IQueryable<T> en vez de IList<T> en el FindAll me serviría? ¿Es buena
idea?

Gracias.

On 7 sep, 01:40, Germán Schuager <[EMAIL PROTECTED]> wrote:
> Hola,
> Yo también estoy haciendo algo con NH.Linq, y en mi NHRepository<T>
> tengo el siguiente método:
>
> public IList<T> Query(Expression<Func<T, bool>> where)
> {
>         using (ISession session = sessionManager.OpenSession())
>         {
>                 return session.Linq<T>().Where(where).ToList();
>         }
>
> }
>
> si bien la sintaxis es distinta a la que vos mencionas, la
> funcionalidad es la misma:
>
> IList<User> users = userRepository.Query(x => x.Name == "prueba");
>
> Además tengo estos otros dos que devuelven un solo objeto:
>
> User user = userRepository.FindBy(x => x.Name, "prueba");
> User user = userRepository.FindBy(x => x.Name == "prueba");
>
> En todos los casos, el filtrado se hace en SQL.
>
> Saludos.
>
> On 5 sep, 07:30, Marc Climent <[EMAIL PROTECTED]> wrote:
>
>
>
> > Hola grupo!
>
> > Estuve haciendo pruebas con Linq to NHibernate y la verdad que estoy
> > deseando ver el resultado de la nueva implementación sin la Criteria
> > API, pero os explico un problemilla que me ha surgido.
>
> > En este momento tengo un NHRepository<T> que es el único que usa
> > NHibernate. Después hay una serie de Services por encima y que se usan
> > desde la aplicación.
>
> > En el NHRepository hay un método tal que así:
>
> >         public IQueryable<T> FindAll()
> >         {
> >             return (from t in session.Linq<T>() select t);
> >         }
>
> > Que devuelve un IQueryable y luego en el Service concreto algo tal que
> > así:
>
> >         public IList<User> FindAllUsers()
> >         {
> >             return (from user in UserRepository.FindAll() select
> > user).ToList();
> >         }
>
> > Siendo UserRepository : NHRepository<User>.
>
> > Hasta aquí todo perfecto. Luego hay métodos que me filtran los
> > usuarios por ejemplo y todo eso, pero no viene al caso. Estuve 
> > leyendohttp://devlicio.us/blogs/billy_mccafferty/archive/2008/09/03/custom-c...
> > y me pareció interesante esa aproximación, pero no me funciona del
> > todo bien como quisiera.
>
> > Si hago esto:
>
> >         public static List<User> WithName(this IList<User> users,
> > string name)
> >         {
> >             return (
> >                        from user in users
> >                        where user.Name == name
> >                        select user)
> >                 .ToList<User>();
> >         }
>
> > Al usar el método, por ejemplo: FindAllUsers.WithName("prueba"),
> > primero me saca todos los Users al hacer el ToList() en el Service y
> > luego me filtra la colección en memoria. (Corregidme si me equivoco)
>
> > Si la colección es pequeña no pasa nada pero si es grande, lo ideal
> > sería que se hiciese esta operación sobre la base de datos
> > directamente.
>
> > Si no es posible hacerlo no pasa nada, puedo seguir trabajando como
> > hasta ahora, haciendo el filtrado en el Service contra los resultados
> > del Repository, que en ese caso si que me filtra realmente via SQL,
> > pero me surgia la duda de si esto que digo es posible y si lo es,
> > dónde está mi error.
>
> > Yo creo que si en vez de hacer el ToList() y devolver IList en el
> > Service, devolviese directamente un IQueryable funcionaría, pero no
> > estoy del todo seguro y tampoco tengo muy claro que eso sea una buena
> > idea, prefiero mantenerme en los ILists y no crear tanta dependencia
> > de Linq.
>
> > Perdonad el rollo que he soltado pero no lo sabía explicar más
> > brevemente.- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---

Responder a