nHibernate ICriteria按许多属性min值排序

时间:2014-09-07 14:21:03

标签: c# nhibernate fluent-nhibernate many-to-many icriteria

如何编写与此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中的属性排序的方法 - 任何线索?

1 个答案:

答案 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更改为配对表的显式实体。这将导致更简化的查询...但在这种情况下,即使使用此

,我们也可以做到这一点