首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroupBy SqlFunction on QueryOver

GroupBy SqlFunction on QueryOver
EN

Stack Overflow用户
提问于 2012-05-29 15:00:52
回答 3查看 1.1K关注 0票数 6

我有一个列表,列出了我使用的所有不同的帐户名前缀(a-z)。

代码语言:javascript
复制
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而不是查询,是因为由于某种原因,子字符串函数是在内存中执行的,而不是在数据库服务器上执行的。

,我通常是这样做的,

代码语言:javascript
复制
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))})

代码语言:javascript
复制
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)))

          );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-01 12:29:53

如果所有其他操作都失败了,您可以使用Projections.SqlGroupProjection进行操作!

代码语言:javascript
复制
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中选择什么,第二个参数是按什么分组,第三个参数是所选列的名称,第四个参数是要选择的数据类型。

票数 4
EN

Stack Overflow用户

发布于 2012-05-31 17:18:01

你的名单有多大?如果小于1000,我将从sql server收集项列表,然后根据对列表的查询执行常规组。

代码语言:javascript
复制
var sqlout= (from acc in this.SessionManager.GetActiveSession().Query<Account>()
          select new
                   {
                     Name = acc.Name,
                     col1= acc.col1
                   }).TolList();

然后

代码语言:javascript
复制
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上运行。

票数 3
EN

Stack Overflow用户

发布于 2012-06-01 12:42:28

您考虑过通过将名称的第一个字符存储在单独的列中来消除对子字符串查询的需求吗?

假设您使用的是Server,则可以将其设置为持久化计算列,以避免必须更新插入/更新表的代码。

添加包含此列的索引的能力也应有助于提高查询性能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10801712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档