使用 Castle ActiveRecord 进行聚合查询

Posted

技术标签:

【中文标题】使用 Castle ActiveRecord 进行聚合查询【英文标题】:Aggregate query with Castle ActiveRecord 【发布时间】:2010-10-24 16:12:29 【问题描述】:

我正在尝试执行一个简单的聚合查询,该查询返回聚合的结果加上一个额外的列。这篇文章 -> Custom query with Castle ActiveRecord 有一个很好的例子来说明如何实现这一点,但我似乎无法让它发挥作用。似乎 ActiveRecordMediator.ExecuteQuery 返回一个对象的 ArrayList(而不是我所期望的 object[] 的 ArrayList)。此外,如果我尝试将其强制转换为 ICollection,我会收到一个运行时错误,抱怨强制强制转换无效。下面的代码,任何帮助表示赞赏(不想使用手写 sql)。

HqlBasedQuery query = new HqlBasedQuery(typeof(Something), @"select count(1),  
  p.Name from Something p 
  where p.SomeDate > :date
  order by p.Name
  group by p.Name");

query.SetParameter("date", new DateTime(2009, 1, 1));

var results = from summary in 
    (ICollection<object[]>)ActiveRecordMediator.ExecuteQuery(query)
    select new 
        Count = (int)summary[0], Name= (string)summary[1]
    ;

“from summary in”之后的那一行是抛出无效转换异常的那一行。

(忘了说:使用VS2008,.NET 3.5SP1,ActiveRecord 1.0RC3,NHibernate 1.2)

【问题讨论】:

【参考方案1】:
    我认为您的意思是 count(*) 而不是 count(1)(这就是为什么您只能获得 1-col 行) ActiveRecordMediator.ExecuteQuery(至少在 RC3 中)返回 object[]ArrayList(不是通用 ICollection) 小心将count 结果转换为int。某些数据库返回计数为 long(例如 SQL Server)

【讨论】:

将您标记为答案,因为您几乎证实了我对无法转换为 ICollection 的怀疑(正如链接问题的答案所建议的那样)。 1) 尽管对我来说并不明显(因为它是有效的 SQL 语法),但实际上 count(1) 搞砸了我的结果。 count(*) 解决了这个问题。 2) 我正在浏览 AR 的主干源代码,但 2.0 似乎仍然如此:/ 感谢您的确认。 3)在匿名代码时那是我的坏事。我已经成为演员表异常的受害者,但也要感谢。

以上是关于使用 Castle ActiveRecord 进行聚合查询的主要内容,如果未能解决你的问题,请参考以下文章

Castle.ActiveRecord多数据库配置

Castle.ActiveRecord环境配置

Castle ActiveRecord学习

Castle ActiveRecord学习

Castle ActiveRecord / NHibernate - 密码加密或散列

Castle ActiveRecord + NHibernate 中的交易傻瓜