NHibernate: как выразить конкретный «групповой» запрос с критериями - PullRequest
0 голосов
/ 19 июля 2010

Вопрос:

Какие критерии / прогнозы могут генерировать следующий запрос?

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 , но бесполезно. И если я сделаю

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 голосов
/ 22 мая 2012

Это должно работать (хотя вы, возможно, захотите SUBSTRING (Имя, 1, 1), но в любом случае):

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