在NHibernate中选择子查询的最小值

时间:2011-08-02 23:03:07

标签: nhibernate subquery

我正在尝试将此SQL查询转换为NHibernate解决方案:

SELECT MIN(TopTimes.StartTime)
FROM (SELECT TOP 100 StartTime FROM Pack ORDER BY StartTime DESC) AS TopTimes

有效地为最后一个X(在本例中为100)启动包我想知道最小StartTime是什么。这似乎并不复杂,但在2小时谷歌搜索之后,我无法以某种方式绕过它。

到目前为止,我有这样的子查询:

DetachedCriteria.For<Pack>()
    .SetProjection(Projections.Property("StartTime"))
    .SetMaxResults(100)
    .AddOrder(Order.Desc("StartTime"));

但我不确定如何将其与Projections.Min

结合起来

更新:详细说明:

示例:让select StartTime from Pack返回以下结果:

2011-08-05 09:05:04.000
2011-08-05 08:05:04.000
2011-08-05 06:05:04.000
2011-08-05 05:05:04.000
2011-08-05 07:05:04.000

我想保留2个最近的开始时间:

SELECT TOP 2 StartTime FROM Pack ORDER BY StartTime DESC

返回:

2011-08-05 09:05:04.000
2011-08-05 08:05:04.000

然后我采取2011-08-05 08:05:04.000的最小值,这就是我所追求的。

建议的select top 2 StartTime from Pack order by StartTime ASC将返回:

2011-08-05 05:05:04.000
2011-08-05 06:05:04.000

这不是我需要的。

1 个答案:

答案 0 :(得分:0)

根据您对该问题的评论。你根本不需要使用'MIN'。

'MIN'会返回一个结果。如果您有一些标准,使用分组,那么您可以返回每个组的最小值。但根据您的信息,这不是必需的。

目前你正在使用DESC(Descending),它会列出从最新到最旧的日期,所以你最终会说:

2011-06-15
2011-05-18
2011-05-13
2011-04-07

您想要更新您的查询以使用ASC(升序),以便您首先获得最早的日期,这将给您相同的结果,如:

2011-04-07
2011-05-13
2011-05-18
2011-06-15

要更新您的查询,您只需要:

DetachedCriteria.For<Pack>()
    .SetProjection(Projections.Property("StartTime"))
    .SetMaxResults(100)
    .AddOrder(Order.Asc("StartTime"));

如果您需要这个作为子查询,那么请您提供更多信息。


您想要订购所有结果,并从中获取最短日期吗?

然后你可以这样做:

DetachedCriteria.For<Pack>()
    .SetProjection(Projections.Min(Projections.Property("StartTime")))
    .SetMaxResults(100)
    .AddOrder(Order.Desc("StartTime"));

这将为您提供最近100个结果的最低/最早单日结果。