2011-12-30 3 views
2

У меня есть следующий запрос в nHibernate. Идея состоит в том, чтобы получить первое и последнее время измерения определенной группы данных.Оптимизация запроса min & max в nHibernate

var measurements = _session.Query<Measurement>() 
          .Where(x => categories.Contains(x.CategoryId)); 
first = measurements.Min(o => o.StartTime); 
last = measurements.Max(o => o.StartTime); 

The SQL Server Profiler дает следующий результат:

exec sp_executesql N'select cast(min(measuremen0_.StartTime) as DATETIME) as col_0_0_ from Measurement measuremen0_ where measuremen0_.Category in (@p0 , @p1)',N'@p0 int,@p1 int',@p0=7654321,@p1=3324673 

exec sp_executesql N'select cast(max(measuremen0_.StartTime) as DATETIME) as col_0_0_ from Measurement measuremen0_ where measuremen0_.Category in (@p0 , @p1)',N'@p0 int,@p1 int',@p0=7654321,@p1=3324673 

Могу ли я как-то оптимизировать этот без использования HQL, так что было бы создать только один запрос на сервер базы данных?

+0

Почему нет HQL? Это против вашей религии или чего-то еще? –

+0

Для меня HQL почти такой же, как для записи SQL, и я думаю, что вы теряете удобочитаемость, IntelliSense и всю точку использования ORM (которая является отношениями отображения). – Tx3

+0

Я должен признать, что иногда вам приходится делать что-то более низкоуровневым способом (например, HQL). Может быть, это такой случай? Но я хотел бы заставить людей думать иначе, чем HQL. – Tx3

ответ

3

Вы взглянули на Future Queries? Я думаю, что он работает и для запросов linq.

+1

Я проверю это и дам вам знать, может ли это быть каким-то сочетанием с max и min – Tx3

+0

Фьючерсы сэкономят вам обратный путь к базе данных, но не сэкономит вам запрос. Не имеет значения. – Hace