0

問:NHibernate的:如何表達與查詢條件的特定的「分組依據」

標準是什麼/凸起,可以產生下面的查詢?

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看起來非常可疑。

+0

你能在點填?目前還不清楚你使用不完整的代碼做什麼。 – 2010-07-19 21:11:48

+0

好吧,填上點(不幸的是我現在沒有在我面前的代碼,但我認爲這是一個正確的)。 – 2010-07-19 22:39:23

+0

這裏有一個可能的解決方法:http://stackoverflow.com/a/12006721/1606945 – 2012-08-17 13:29:29

回答

0

這應該工作(儘管你可能想SUBSTRING(名稱,1,1),但無論如何):

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