nHibernate ICriteria按多对多属性最小值排序

本文关键字:最小值 排序 属性 nHibernate ICriteria | 更新日期: 2023-09-27 18:20:53

如何编写与此linq匹配的ICriteria

ProgramItems.OrderBy(x => x.TimeBlocks.Min(y => y.StartTime))

ProgramItem-TimeBlock具有多对多关系。

我可以用以下代码通过TimeBlock id进行筛选:

criteria.Add(Subqueries.Exists(DetachedCriteria.For<ProgramItem>("p")
        .CreateAlias("p.TimeBlocks", "timeBlocks")
        .Add(Restrictions.EqProperty("p.Id", "ProgramItem.Id"))
        .Add(Restrictions.Eq("timeBlocks.Id", request.TimeBlockId))
        .SetProjection(Projections.GroupProperty("p.Id"))
        .Add(Restrictions.Eq(Projections.Count("p.Id"), 1))));

但我找不到使用别名/投影按TimeBlock中的属性排序的方法——有线索吗?

nHibernate ICriteria按多对多属性最小值排序

如何通过many-to-many端订购BY的方式如下所示:

var subquery = DetachedCriteria.For<TimeBlock>("timeBlock")
    .CreateAlias("timeBlock.ProgramItems", "programItems")
    .SetProjection(Projections.Min("timeBlock.StartTime"))
    .Add(Restrictions.EqProperty("programItems.Id", "root.Id"));
// ORDER BY built from Subquery
var orderByMin = new Order(Projections.SubQuery(subquery), true); // true is ASC
var list = session
    .CreateCriteria<ProgramItem>("root")
    .AddOrder(orderByMin)
    .SetMaxResults(10)    // paging... if needed
    .List<ProgramItems>();

正如我们所看到的,many-to-many的两个都必须映射。然后,我们在TimeBlock实体上构建MIN部分,并使用到ProgramItem表的JOIN。这在根查询中用作一种过滤方式。

我的建议是将many-to-many更改为具有用于配对表的显式实体。这将导致更简化的查询。。。但在这种情况下,我们甚至可以使用这个