我正在尝试弄清楚如何使用Castle ActiveRecord执行自定义查询。
我能够运行返回我的实体的简单查询,但我真正需要的是下面的查询(使用自定义字段集):
选择count(1)作为cnt,来自workstationevent的数据,其中serverdatetime> =:minDate和serverdatetime< :maxDate和userId = 1 group by data count(1)> :阈值
谢谢!
答案 0 :(得分:6)
在这种情况下,您想要的是HqlBasedQuery
。您的查询将是一个投影,因此您将获得的是包含结果的ArrayList
个元组(ArrayList的每个元素的内容将取决于查询,但是对于多个值将是object[]
)。
HqlBasedQuery query = new HqlBasedQuery(typeof(WorkStationEvent),
"select count(1) as cnt, data from workstationevent where
serverdatetime >= :minDate and serverdatetime < :maxDate
and userId = 1 group by data having count(1) > :threshold");
var results =
(ArrayList)ActiveRecordMediator.ExecuteQuery(query);
foreach(object[] tuple in results)
{
int count = (int)tuple[0]; // = cnt
string data = (string)tuple[1]; // = data (assuming this is a string)
// do something here with these results
}
您可以创建匿名类型以更有意义的方式保存结果。例如:
var results = from summary in
(ArrayList)ActiveRecordMediator.ExecuteQuery(query)
select new {
Count = (int)summary[0], Data = (string)summary[1]
};
现在,结果将包含一系列包含属性Count
和Data
的匿名类型。或者你确实可以创建自己的摘要类型并以这种方式填充它。
ActiveRecord也有ProjectionQuery
,它做了很多相同的事情,但只能返回实际的映射属性而不是聚合或函数,就像使用HQL一样。
答案 1 :(得分:0)
请注意,如果你像我一样使用ActiveRecord 1.0.3(RC3),这将导致运行时InvalidCastException。 ActiveRecordMediator.ExecuteQuery返回ArrayList而不是通用ICollection。因此,为了使其工作,只需更改此行:
var results = (ICollection<object[]>) ActiveRecordMediator.ExecuteQuery(query);
到
var results = (ArrayList) ActiveRecordMediator.ExecuteQuery(query);
它应该有用。
另请注意,在hql语句中使用count(1)将使查询返回String的ArrayList而不是object []的ArrayList(这是使用count(*)时得到的。)
我以为我会指出这一点,以便将它们全部记录在一个地方。