我有一个列表,列出了我使用的所有不同的帐户名前缀(a-z)。
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))));然而,我想要做的不是返回一个不同的列表,而是对前缀进行分组,并返回以该前缀开头的帐户数,但我不确定如何使用query over来执行一个组,因为它不像标准linq那样简单。
我之所以使用QueryOver而不是查询,是因为由于某种原因,子字符串函数是在内存中执行的,而不是在数据库服务器上执行的。
,我通常是这样做的,
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(“子字符串”,NHibernateUtil.String,新的[] {属性(“名称”),常量(转换(1)),常数(转换(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)))
);发布于 2012-06-01 12:29:53
如果所有其他操作都失败了,您可以使用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"));第一个参数是在select中选择什么,第二个参数是按什么分组,第三个参数是所选列的名称,第四个参数是要选择的数据类型。
发布于 2012-05-31 17:18:01
你的名单有多大?如果小于1000,我将从sql server收集项列表,然后根据对列表的查询执行常规组。
var sqlout= (from acc in this.SessionManager.GetActiveSession().Query<Account>()
select new
{
Name = acc.Name,
col1= acc.col1
}).TolList();然后
var prefixes = (from acc in sqlout
group acc by acc.Name.Substring(0, 1)
into grp
select new
{
Prefix = grp.Key,
Count = grp.Count()
});子字符串函数在这里工作,因为它在c#列表上运行,而不是在sql server上运行。
发布于 2012-06-01 12:42:28
您考虑过通过将名称的第一个字符存储在单独的列中来消除对子字符串查询的需求吗?
假设您使用的是Server,则可以将其设置为持久化计算列,以避免必须更新插入/更新表的代码。
添加包含此列的索引的能力也应有助于提高查询性能。
https://stackoverflow.com/questions/10801712
复制相似问题