Ok, ya lo encontré.
Revisando la documentación de Linq to SQL (http://msdn.microsoft.com/
en-us/library/bb425822.aspx) y esto es lo que pone:
"The AsEnumerable() operator, unlike ToList() and ToArray(), does not
cause execution of the query. It is still deferred. The AsEnumerable()
operator merely changes the static typing of the query, turning a
IQueryable<T> into an IEnumerable<T>, tricking the compiler into
treating the rest of the query as locally executed."
Así que entiendo que en NHLinq funciona de forma análoga, lo que
corresponde con el comportamiento que he observado en las pruebas. De
modo que no debería hacer ToList() hasta no querer ejecutar la
consulta sobre la base de datos.
Todo claro, gracias.
On 8 sep, 14:28, GLM.net <[EMAIL PROTECTED]> wrote:
> 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 - Argentinawww.glmnet.com.ar- 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
-~----------~----~----~----~------~----~------~--~---