JCo*_*ine 6 c# sql nhibernate 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))));
Run Code Online (Sandbox Code Playgroud)
但是,我想要做的不是返回一个不同的列表,而是将前缀分组,并返回以该前缀开头的帐号数,但我不确定如何使用查询来执行组,因为它不像标准那样简单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()
});
Run Code Online (Sandbox Code Playgroud)
编辑这是我尝试但我收到以下错误
表达式中无法识别的方法调用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)))
);
Run Code Online (Sandbox Code Playgroud)
如果其他方法都失败了,您可以使用 Projections.SqlGroupProjection 来完成此操作!
var accounts = _busDb.Session.QueryOver<QueueEntity>()
.Select(
Projections.SqlGroupProjection(
"SUBSTRING({alias}.Name, 1) as FirstChar",
"SUBSTRING({alias}.Name, 1)",
new[] {"FirstChar"},
new[] {NHibernateUtil.String}),
Projections.Count("id"));
Run Code Online (Sandbox Code Playgroud)
第一个参数是在选择中选择的内容,第二个参数是分组依据的内容,第三个参数是所选列的名称,第四个参数是所选数据的类型。