【问题标题】:SQL to Nhibernate criteriaSQL 到休眠条件
【发布时间】:2013-01-21 11:09:51
【问题描述】:

我将 ClassA 类映射到表 TableA。如何将下一个 sql 转换为 NHibernate 条件?

  SELECT DISTINCT t.Id, (Select COUNT(*) FROM TableA WHERE [Id] = t.Id)
  FROM TableA AS t

更新 1: TableA 确实是一个视图。它用于合并来自两个表的统计信息。 ID 不是身份,只是字段,如有歧义,请见谅。

【问题讨论】:

  • 我有几个cmets。首先 - 这个查询似乎有一个循环引用。第二 - 我认为您不必在 ID 列上查询 DISTINCT。第三 - 看起来您正在尝试计算 one-to-many 关系的多方面。如果是这种情况,为什么不把关系映射到对象上,然后你可以做MyObject.ChildItems.Count
  • 感谢您的回复。请查看更新 1。
  • 由于相关的子查询和不同的查询,看起来这可能是一个非常低效的查询。您是否考虑过写作是在 t.id 上进行分组?
  • 还没有,但这似乎是个好主意。谢谢!

标签: sql nhibernate fluent-nhibernate


【解决方案1】:

来自http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

List results = session.CreateCriteria(typeof(ClassA))
    .SetProjection( Projections.ProjectionList()
        .Add( Projections.RowCount() )
        .Add( Projections.GroupProperty("Id") ) )
    .List();

或者使用 Linq:

from a in session.Query<ClassA>
group a by a.Id into g
select new { g.Key, g.Count())

【讨论】:

  • 谢谢!有用。顺便说一句,当我为“Id”字段添加 Restrictions.In 时,结果不正确(在我的情况下是 3 个元素而不是 20 个)。什么会导致这样的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多