GroupBy SqlFunction на QueryOver

У меня есть список всех различных префиксов имени учетной записи (az), которые я получаю, используя

var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>();

var q = accounts.Select(Projections.Distinct(
        Projections.SqlFunction("substring", 
                                NHibernateUtil.String, 
                                Projections.Property("Name"),
                                Projections.Constant(1),
                                Projections.Constant(1))));

Однако то, что я хочу сделать, это вместо возврата отдельного списка группа префиксы и возвращают количество учетных записей, которые начинаются с этого префикса, но я не уверен, как создать группу с помощью запроса, так как это не так просто, как стандартный linq.

Причина, по которой я использую QueryOver, а не Query, заключается в следующем. потому что по какой-то причине функция подстроки выполняется в памяти, а не на сервере базы данных.

Обычно я это делаю так

var prefixes = (from acc in this.SessionManager.GetActiveSession().Query<Account>()
              group acc by acc.Name.Substring(0, 1)
              into grp
              select new
                       {
                         Prefix = grp.Key,
                         Count = grp.Count()
                       });

РедактироватьЭто то, что я пробовал, но получил следующую ошибку

Нераспознанный вызов метода в выражении SqlFunction("substring", NHibernateUtil.String, new [] {Property("Name"), Constant(Convert(1)), Constant(Convert(1))})

var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>().Select(
            Projections.Group<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
                                                       Projections.Property("Name"), Projections.Constant(1),
                                                       Projections.Constant(1))),
            Projections.Count<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
                                                       Projections.Property("Name"), Projections.Constant(1),
                                                       Projections.Constant(1)))

          );
6
задан JConstantine 30 May 2012 в 07:54
поделиться