【问题标题】:NHibernate Grouping QueryNHibernate 分组查询
【发布时间】:2015-07-16 12:10:31
【问题描述】:

我有一张这样的桌子

Id   |  Ref    |   Field1
1       Myles1     Blah
2       Myles1     Rubarb
3       Myles2     Custard
4       Ted        Cheese

我想通过 NHibernate 会话查询它,以便返回包含给定搜索字符串的每个 Ref 的第一行,因此搜索词“Myles”的结果集将是

Id   |  Ref    |   Field1
1       Myles1     Blah
3       Myles2     Custard

这样的流利映射

public class EntityClassMap : ClassMap<Entity>
{
    public EntityClassMap()
    {
        Id(x => x.Id);
        Map(x => x.Ref);
        Map(x => x.Field1);           
    }
}

【问题讨论】:

  • 什么是“第一行”?哪个重要吗?
  • 第一行表示每个组中在参考搜索中命中的第一行。实际上,在这种情况下,只要我只为每个 ref 排在行上,它就不必是第一个。
  • 关系数据库中的行没有自然顺序,因此在您决定查询中的排序之前没有“第一行”。
  • 在这种情况下,排序将是 Id 字段

标签: sql nhibernate queryover


【解决方案1】:

有一个详细的描述如何复杂的查询(用HAVINGGROUP BY我们可以做到:Query on HasMany reference

如果我们想找出具有按 Ref 分组的 Min(Id) 的实体,我们需要 subquery。它可能看起来像这样:

// alias for inner query
MyEntity inner = null;
// this alias is for outer query, and will be used in 
// inner query as a condition in the HAVING clause
MyEntity outer = null;

var minIdSubquery = QueryOver.Of<MyEntity>(() => inner)
    .SelectList(l => l
        .SelectGroup(() => inner.Ref) // here we GROUP BY
        .SelectMin(() => inner.Id)
    )
    // HAVING to get just Min(id) match
    .Where(Restrictions.EqProperty(
      Projections.Min<MyEntity>(i => i.Id),
      Projections.Property(() => outer.Id)
    ));

// outer query
var query = session.QueryOver<MyEntity>(() => outer)
    .WithSubquery
    // we can now use EXISTS, because we applied match in subquery
    .WhereExists(minIdSubquery);

在文档16.8. Subquerieshere 中查看更多信息

【讨论】:

  • 我认为没有一对多。一个简单的 Min(Field1),按 Ref 分组,有 blah 就足够了。
  • 正确,没有一对多..将映射类添加到问题中。你能举个例子吗?谢谢
猜你喜欢
  • 2017-05-11
  • 2011-12-29
  • 2011-02-27
  • 1970-01-01
  • 2011-05-06
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多