2011-12-30 76 views
2

我在nHibernate中有一個以下查詢。這個想法是獲得某個數據組的首次和最後一次測量時間。在nHibernate中優化最小和最大查詢

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

的SQL Server事件探查給出了下面的輸出:

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?這是違揹你的宗教或什麼的? – 2011-12-30 13:07:50

+0

對我來說,HQL與編寫SQL幾乎相同,我認爲你會失去可讀性,智能感知以及使用ORM(即映射關係)的全部觀點。 – Tx3 2011-12-30 13:13:05

+0

我不得不承認,有時你必須以更低級別的方式來做事情(如HQL)。也許這是這種情況?但我想推動人們以不同於HQL的方式來思考答案。 – Tx3 2011-12-30 13:15:59

回答

3

你看過Future Queries嗎?我認爲它也適用於linq查詢。

+1

我會檢查它,並讓你知道它可以是一些如何結合最大和最小 – Tx3 2011-12-30 13:17:12

+0

期貨將節省您往返數據庫,但不保存您的查詢。應該不重要。 – Hace 2011-12-30 19:32:40