微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – QueryOver上的GroupBy SqlFunction

我有一个我使用的所有不同帐户名称前缀(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))));

但是,我想要做的不是返回一个不同的列表,而是将前缀分组,并返回以该前缀开头的帐号数,但我不确定如何使用查询来执行组,因为它不像标准那样简单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”,new [] {Property(“Name”),Constant(Convert(1)),Constant(Convert(1))})

var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>().Select(
            Projections.Group<string>(x => Projections.sqlFunction("substring",Projections.Constant(1))),Projections.Count<string>(x => Projections.sqlFunction("substring",Projections.Constant(1)))

          );

解决方法

如果其他所有方法都失败了,您可以使用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中选择的内容,第二个参数是分组的内容,第三个参数是所选列的名称,第四个参数是所选数据的类型.

原文地址:https://www.jb51.cc/csharp/92722.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐