Teoricamente lo que planteas es correcto, linq "retrasa" la ejecucion del
query hasta que se haga un List() por ejemplo, mientras tanto devuelve
IQueryable, si volves a usar linq, el va a intentar crear una nueva
IQueryable a partir de tu IList, que ya esta en memoria, para mas info proba
en google con "Linq delayed execution"

2008/9/8 Marc Climent <[EMAIL PROTECTED]>

> **
> 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 -
>  >
>


-- 
GLM
MCAD / MCP - Argentina
www.glmnet.com.ar

--~--~---------~--~----~------------~-------~--~----~
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