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
