代码之家  ›  专栏  ›  技术社区  ›  Mark Dickinson

仅使用nHibernate获取最新结果

  •  1
  • Mark Dickinson  · 技术社区  · 17 年前

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

    问题是,用户一直在添加结果,而我希望显示一个表,其中包含我拥有的所有不同结果类型的所有最新结果。

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

    谢谢

    4 回复  |  直到 17 年前
        1
  •  2
  •   Erik Öjebo    17 年前

    您可以使用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>();
    
        2
  •  1
  •   Anton Gogolev    17 年前

    订购人 ResultDate

        3
  •  1
  •   Frederik Gheysels    17 年前

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

    这意味着,对于每个结果类型,他只希望看到一行,这就是上次为该类型添加的结果。

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

    <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。

    我没有测试它,也没有编译它,但这是我将遵循的路径来实现这一点。

        4
  •  0
  •   yonexbat    12 年前

    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     
    )