【发布时间】:2012-01-30 12:47:04
【问题描述】:
我在 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 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,使其仅向数据库服务器创建 一个 请求?
【问题讨论】:
-
为什么没有 HQL?是违反你的宗教信仰还是什么?
-
对我来说,HQL 几乎与编写 SQL 相同,我认为您会失去可读性、IntelliSense 以及使用 ORM(即映射关系)的全部意义。
-
我不得不承认,有时你必须以更底层的方式(比如 HQL)来做事。也许这就是这种情况?但我想推动人们以 HQL 以外的其他方式思考答案。
-
1. HQL 不是低级的,它和 LINQ 一样是面向对象的,但更灵活。 2. 有一些插件可以让你获得 HQL 智能感知。 3. 如果 Intellisense 是你使用 LINQ 的原因,也许 NH 不是最适合你的框架。
-
我认为这个问题是合理的,并且在不使用 HQL 的情况下也有答案。仅仅因为 OP 不希望 HQL 并不意味着他应该完全放弃 NHibernate。我只是觉得你是一个有点苛刻的迭戈。
标签: c# nhibernate query-optimization