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-Ocultartexto de 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-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
>

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