linq - NHibernate 3.0: No FirstOrDefault() con QueryOver?
queryover join (4)
Ahora he descubierto que podría usar el método de extensión Take () en la instancia de IQueryOver, y solo la enumeración a una lista, de esta manera:
Result precedingOrMatchingResult = Session.QueryOver<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderBy(r => r.TimeStamp).Desc.
Take(1).List(). //enumerate only on element of the sequence!
FirstOrDefault(); //get the preceding or matching result, if there is any
Estoy jugando con FluentNHibernate y NH 3.0, usando el proveedor LINQ y la nueva sintaxis de QueryOver.
Ahora con QueryOver quiero obtener un elemento (llamado resultado) con un valor de marca de tiempo lo más cerca posible de un valor dado, pero no mayor:
Result precedingOrMatchingResult = Session.QueryOver<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderBy(r => r.TimeStamp).Desc.
FirstOrDefault(); //get the preceding or matching result, if there is any
Ahora, Intellisense me dice que no existe un método FirstOrDefault()
. Por supuesto, podría enumerar mi consulta ordenada y luego usar LINQ para obtener mi artículo. Pero esto cargaría todos los elementos en la memoria primero.
¿Hay una alternativa a FirstOrDefault()
, o he entendido algo completamente incorrecto?
NH 3 tiene un proveedor LINQ integrado (las consultas se traducen internamente a HQL / SQL). Debe agregar el espacio de nombres NHibernate.Linq y luego:
Result precedingOrMatchingResult = Session.Query<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderByDescending(r => r.TimeStamp).
FirstOrDefault();
Tratar
Result precedingOrMatchingResult = Session.QueryOver<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderBy(r => r.TimeStamp).Desc.
SetFetchSize(1).
UniqueResult();
UniqueResult devolverá un solo valor, o nulo si no se encuentra ningún valor, que es un poco lo que hace Primero o Predeterminado.
Establecer el Tamaño de recuperación en 1 puede o no ser necesario, lo probaría con un perfilador.
Result precedingOrMatchingResult = Session.QueryOver<Result>()
.Where(r => r.TimeStamp < timeStamp)
.OrderBy(r => r.TimeStamp).Desc
.SingleOrDefault();