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中的属性排序的方法——有线索吗?
如何通过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
更改为具有用于配对表的显式实体。这将导致更简化的查询。。。但在这种情况下,我们甚至可以使用这个