I am playing with FluentNHibernate and NH 3.0, using the LINQ provider and the new QueryOver syntax.
Now with QueryOver I want to get an item (called result) with a timestamp value as close as possible to a given value, but not greater:
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
Now, Intellisense tells me that there is no such thing as a FirstOrDefault()
method. I could, of course, enumerate my ordered query, and then use LINQ to get my item. But this would load all items into memory first.
Is there an alternative to FirstOrDefault()
, or have I understood something completely wrong?
I have now found out that I could use the Take() extension method on the IQueryOver instance, and only the enumerate to a list, like so:
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
Result precedingOrMatchingResult = Session.QueryOver<Result>() .Where(r => r.TimeStamp < timeStamp) .OrderBy(r => r.TimeStamp).Desc .SingleOrDefault();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With