NHibernate:如何用条件表达特定的“分组依据”查询

时间:2010-07-19 19:00:55

标签: c# nhibernate group-by nhibernate-criteria nhibernate-projections

问题:

可以生成以下查询的条件/预测是什么?

SELECT SUBSTRING(Name, 0, 1) FROM Person GROUP BY SUBSTRING(Name, 0, 1)

(显然DISTINCT这个更容易,但我稍后需要计数,当我解决这个问题时)。

<小时/> 我的方法:

我的主要问题是常量,因为如果我使用

Projections.GroupProperty(Projections.SqlFunction(
   "SUBSTRING",
   NHibernateUtil.String,
   Projections.GroupProperty("Name"),
   Projections.Constant(0),
   Projections.Constant(1)
))

我得到了

SELECT SUBSTRING(Name, 0, 1) FROM Person GROUP BY SUBSTRING(Name, , )

从NH source code显而易见,但没用。 如果我做了

Projections.GroupProperty(Projections.SqlFunction(
   "SUBSTRING",
   NHibernateUtil.String,
   Projections.GroupProperty("Name"),
   Projections.GroupProperty(Projections.Constant(0)),
   Projections.GroupProperty(Projections.Constant(1))
))

然后我得到

SELECT SUBSTRING(Name, @p0, @p1) FROM Person GROUP BY SUBSTRING(Name, ?, ?)

其中问号似乎是一些未解决的参数,但我不知道为什么。

<小时/> 更多详情:

我刚刚找到

AbstractEntityJoinWalker.InitProjection(
    SqlString projectionString,
    SqlString whereString,
    SqlString orderByString,
    string /* WTF? */ groupByString,
    SqlString havingString,
    LockMode lockMode
)

groupByString的类型看起来非常可疑。

1 个答案:

答案 0 :(得分:0)

这应该有效(尽管你可能想要SUBSTRING(Name,1,1)但是无论如何):

Projections.SqlGroupProjection(
    "SUBSTRING(Name, 0, 1) as FirstChar",
    "SUBSTRING(Name, 0, 1)",
    new [] {"FirstChar"}, 
    new[] {NHibernateUtil.String}
)