NHibernate 3.0: нет FirstOrDefault () с QueryOver?
Я играю с FluentNHibernate и NH 3.0, используя поставщик LINQ и новый синтаксис QueryOver.
Теперь с QueryOver я хочу получить элемент (называемый result) со значением метки времени как можно ближе к заданному значению, но не больше:
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
Теперь Intellisense говорит мне, что нет такой вещи, как FirstOrDefault()
метод. Конечно, я мог бы перечислить свой заказанный запрос, а затем использовать LINQ для получения моего элемента. Но это загрузит все элементы в память первый.
есть ли альтернатива FirstOrDefault()
, или я понял что-то совершенно неправильно?
4 ответов
NH 3 имеет интегрированный поставщик LINQ (запросы переводятся внутренне на HQL/SQL). Вы должны добавить NHibernate.Пространство имен Linq, а затем:
Result precedingOrMatchingResult = Session.Query<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderByDescending(r => r.TimeStamp).
FirstOrDefault();
теперь я узнал, что могу использовать метод расширения Take () в экземпляре IQueryOver и только перечисление в список, например:
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();
попробовать
Result precedingOrMatchingResult = Session.QueryOver<Result>().
Where(r => r.TimeStamp < timeStamp).
OrderBy(r => r.TimeStamp).Desc.
SetFetchSize(1).
UniqueResult();
UniqueResult вернет одно значение или null, если значение не найдено, что и делает First или Default.
установка размера выборки в 1 может потребоваться или не потребоваться, я бы проверил это с помощью профилировщика.