У меня есть список всех различных префиксов имени учетной записи (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)))
);