gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:04 25 4
gpt4 key购买 nike

如何编写与此 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 结束 ORDER 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>();

正如我们所见,多对多都必须被映射。然后,我们在 TimeBlock 实体上构建 MIN 部分 - 连接到 ProgramItem 表。这在根查询中用作一种过滤方式。

我的建议是更改多对多 以具有配对表的显式实体。这将导致更加简化的查询......但在这种情况下,我们甚至可以用这个来做到这一点

关于c# - nHibernate ICriteria 按多对多属性最小值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25711180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com