【问题标题】:Optimizing min & max query in nHibernate在 nHibernate 中优化最小和最大查询
【发布时间】: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


【解决方案1】:

你看过Future Queries吗?我认为它也适用于 linq 查询。

【讨论】:

  • 我会检查一下,让你知道它是否可以与 max 和 min 结合使用
  • Futures 将为您节省到数据库的往返时间,但不会为您节省查询。应该没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2014-08-06
  • 2012-05-03
  • 2023-04-08
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多