只能使用nHibernate获取最新结果

时间:2009-04-14 12:48:52

标签: nhibernate

我有像这样的nHibernate查询

ICriteria query = session.CreateCriteria(typeof(MyResult))
            .Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))

问题是用户一直在添加结果,我想显示所有不同ResultTypes的所有最新结果的表格。

MyResult类有一个属性ResultDate。我的问题是,我将如何添加到查询中以使其仅返回给定结果类型的最新结果。没有什么可说的,结果将在数据库中按日期顺序排列。

谢谢,

标记

4 个答案:

答案 0 :(得分:2)

您可以使用AddOrder方法按ResultDate排序结果,如下所示:

ICriteria query = session.CreateCriteria(typeof(MyResult))
        .Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))
        .AddOrder(Order.Desc("ResultDate"))
        .List<MyResult>();

如果要限制返回的MyResult实例的数量,可以使用SetMaxResults方法,如下所示:

ICriteria query = session.CreateCriteria(typeof(MyResult))
        .Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))
        .AddOrder(Order.Desc("ResultDate"))
        .SetMaxResults(20)
        .List<MyResult>();

答案 1 :(得分:1)

ResultDate排序(降序)并选择您觉得合适的顶部。

答案 2 :(得分:1)

如果我理解这个问题,Mark希望看到每种类型的所有最后结果的概述。

这意味着,对于每种结果类型,他只想看到一行,这就是最后为该类型添加的结果。

我认为,实现这一目标的最简单方法是创建一个额外的类,我们可以将其称为“MyResultOverview”:

public class MyResultOverview
{
    public int ResultId {get; set;}
    public int ResultTypeId {get; set;}
    public DateTime ResultDate {get; set;}
}

不应映射此类,但NHibernate应该知道此类存在。因此,我们必须导入它:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
   <import class="MyResultOverview" />
</hibernate-mapping>

然后,我们可以创建一个ICriteria,它将填充MyResultOverview的实例(并且还将生成最有效的SQL查询以获得此概述)。 看起来应该是这样的:

ICriteria criteria = session.CreateCritera (typeof(MyResult));

criteria.SetProjection (Projections.ProjectionList ()
                           .Add (Projections.Property("Id"), "ResultId")
                           .Add (Projections.Property("ResultType"), "ResultType")
                           .Add (Projections.Max("ResultDate"), "ResultDate"));

criteria.SetResultTransformer (Transformers.AliasToBean (typeof(MyResultOverview)));

IList<MyResultOverview> results = criteria.List<MyResultOverview>();

这应该会为您提供MyResultOverview实例的列表,这些实例代表您正在寻找的MyResults。 然后,为了检索MyResult本身,您可以通过检索您已检索到的particalur ResultId的MyResult实例来执行此操作。

我没有对此进行过测试,也没有对其进行编译,但这是我要实现这一目标的路径。

答案 3 :(得分:0)

在HQL中,这可能有效:

select item, tag
from MyItem item
    join item.Tags tag
where tag.Id = (                                    
    select  max(tag2.Id)  
    from MyItem item2
        join item2.Tags tag2
    where item2.Id = item.Id
    group by item2.Id     
)