我有一个我使用获取的所有不同帐户名称前缀 (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))));
但是,我想要做的不是返回一个不同的列表,而是对前缀进行分组并返回以该前缀开头的帐户数,但我不确定如何通过使用查询来执行组,因为它不像标准那样简单林克
我使用 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)))
);