2011-12-30 77 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