c# - QueryOver 上的 GroupBy SqlFunction

标签 c# sql nhibernate queryover

我有一个列表,其中包含我使用的所有不同的帐户名称前缀 (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", 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)))

          );

最佳答案

如果其他方法都失败了,您可以使用 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"));

第一个参数是选择中选择的内容,第二个参数是分组依据,第三个参数是所选列的名称,第四个参数是正在分组的数据类型已选中。

关于c# - QueryOver 上的 GroupBy SqlFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801712/

相关文章:

wcf - 如何为多个数据库实现存储库模式

c# - 将txt数据转换为空行分隔的List

c# - 获取 Roslyn 类之间的依赖关系

sql - 这被归类为复合主键吗?

Mysql多次连接两个表

php - 生成的 View 填充了 NULL

c# - 如何从 asp.net webform 中的 gridview 优化 "foreach"事件?

c# - 在测试期间覆盖 DateTime.Now 的好方法是什么?

nhibernate - 我是否应该担心默认情况下ORM返回所有列?

nhibernate - 是否可以为 NHibernate session 中的所有实体启用/禁用延迟加载?