Ok, entonces con
return sesion.Query<C>().Where(where).FirstOrDefault<C>();
todo resuelto y eficiente no?

¡Muchas gracias!

On 17 ene, 17:33, José F. Romaniello <[email protected]> wrote:
> El 17 de enero de 2012 13:07, BlackCid <[email protected]> escribió:
>
> >  Una duda que me surge, este select... ¿crea uno a uno los campos-
> > >objeto de la base de datos para hacer la comparacion o lo hace de
> > manera eficiente (es decir, con un select normal por debajo)?
>
> En el caso de LINQ, si, lo hace de manera eficiente, es decir con un select
> normal de solo lo que necesitas. Ademas hasta que no haces ToList, ToArray,
> First, FirstOrDefault, Single, SingleOrDefault etc... Cualquiera de estos
> metodos en LINQ produce que el IQueryable se resuelva es en ese punto donde
> va a la bd...
>
> ¿Es la siguiente manera la unica forma de evitar la excepcion de que
>
> > no hay elementos que cumplan la condicion?
> > IQueryable<C> obtenido = sesion.Query<C>().Where(where);
> > if(obtenido.Count<C>() == 0){
> >   return null;
> > }else{
> >   return obtenido.First<C>();
> > }
>
> De hecho creo que esa es la peor forma, veo varios errores ahí. Pero vamos
> por parte, en LINQ hay muchos metodos que vienen de a pares, por ejemplo
> esta el metodo "First" y esta el metodo "FirstOrDefault".
> Last/LastOrDefault, Single/SingleOrDefault.
>
> First: devuelve el primero, pero si la enumeración esta vacía produce la
> excepción que mencionas.
> FirstOrDefault: devuelve el primero, pero si esta vacía devuelve el
> default. El default es por lo general nulo, excepto para tipos por valor
> como int, long etc... en ese caso te da el default del tipo (para los que
> mencione es 0).
>
> Lo mismo pasa con Last y con Single. Salvo que Single explota también si
> hay mas de uno en la enumeración.
>
> Por otro lado hay algo medio flojo aca:
>
> if(obtenido.Count<C>() > 0)
>  obtenido.First<c>().
>
> Tene cuidado con estas cosas, por que estas ejecutando dos consultas a la
> base de datos.. una que sería:
>
> select count(*) ... from x.
>
> y otra select top 1 ... from x
>
> Aunque realmente quisieras hacer esto, algo.Count<c>() > 0 es muy flojo....
> Usa mejor "algo.Any()"
>
>
>
> > On 17 ene, 16:40, Jose Selesan <[email protected]> wrote:
> > > No falta un "using NHibernate.Linq"?
>
> > > José
>
> > > 2012/1/17 BlackCid <[email protected]>
>
> > > > Estoy usando Nhibernate 3.1.0.4000 con Ling Fu.
>
> > > > On 17 ene, 16:31, BlackCid <[email protected]> wrote:
> > > > > Mmm.. aun poniendo lo de using system.link del objeto sesion de
> > > > > nhibernate no me sale la funcion Query a secas :-/? debo tener algo
> > > > > raro.
>
> > > > > On 17 ene, 16:22, José F. Romaniello <[email protected]> wrote:
>
> > > > > > NHibernate tiene muchas formas para escribir consultas, la que yo
> > te
> > > > dije
> > > > > > esta bien y la que vos dijiste esta bien también :)
> > > > > > También podes usar hql.
>
> > > > > > El 17 de enero de 2012 12:18, BlackCid <[email protected]>
> > escribió:
>
> > > > > > > Yo supongo que seria asi:
> > > > > > >  sesion.QueryOver<C>().Where(f => f.campo ==
> > 1).List().First<C>();
> > > > > > > ¿no?
>
> > > > > > > On 17 ene, 16:12, BlackCid <[email protected]> wrote:
> > > > > > > > Gracias, aunque tengo algunas dudas extra:
> > > > > > > > -Supongo que es QueryOver no?
> > > > > > > > -Si quiero obtener el objeto como haria un get normal en lugar
> > de
> > > > un
> > > > > > > > campo, como lo hago?
> > > > > > > > -La funcion first no existe :-/
>
> > > > > > > > On 17 ene, 14:52, José F. Romaniello <[email protected]>
> > > > wrote:
>
> > > > > > > > > No se si entendí bien la pregunta, pero creo que con linq
> > sería
> > > > algo
> > > > > > > así:
>
> > > > > > > > > var valor = session.Query<Foo>()
> > > > > > > > >            .Where(f => f.CampoUnico == 1)   //Filtrar por el
> > > > campo
> > > > > > > único
> > > > > > > > >            .Select(f => f.Campo)
> > //Seleccionar
> > > > el
> > > > > > > campo
> > > > > > > > > que queres
> > > > > > > > >            .First();
> > > >  //solo el
> > > > > > > > > primero resultado..
>
> > > > > > > > > El 17 de enero de 2012 06:02, BlackCid <[email protected]>
> > > > escribió:
>
> > > > > > > > > > ¿Se puede obtener sin uso de un select explícito un campo
> > por
> > > > una
> > > > > > > > > > columna única que posee pero que no es pk?
>
> > > > > > > > > > Gracias de antemano.
>
> > > > > > > > > > --
> > > > > > > > > > Para escribir al Grupo, hágalo a esta dirección:
> > > > > > > > > > [email protected]
> > > > > > > > > > Para más, visite:
>
> >http://groups.google.com/group/NHibernate-Hispano-Ocultartextodela
> > > > > > > cita -
>
> > > > > > > > > - Mostrar texto de la cita -- 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-Ocultartextode la
> > > > cita -
>
> > > > > > - Mostrar texto de la cita -- 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-Ocultartexto 
> > > > 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- 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