如何编写与此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中的属性排序的方法 - 任何线索?
答案 0 :(得分:2)
如何通过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>();
我们可以看到,必须映射many-to-many
的结尾。然后我们在TimeBlock
实体上构建MIN部分 - 加入ProgramItem
表。这在根查询中用作过滤方式。
我的建议是将many-to-many
更改为配对表的显式实体。这将导致更简化的查询...但在这种情况下,即使使用此