我有像这样的nHibernate查询
ICriteria query = session.CreateCriteria(typeof(MyResult))
.Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))
问题是用户一直在添加结果,我想显示所有不同ResultTypes的所有最新结果的表格。
MyResult类有一个属性ResultDate。我的问题是,我将如何添加到查询中以使其仅返回给定结果类型的最新结果。没有什么可说的,结果将在数据库中按日期顺序排列。
谢谢,
标记
答案 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
)