使用Castle ActiveRecord进行自定义查询

时间:2008-11-21 08:43:21

标签: castle-activerecord

我正在尝试弄清楚如何使用Castle ActiveRecord执行自定义查询。

我能够运行返回我的实体的简单查询,但我真正需要的是下面的查询(使用自定义字段集):

选择count(1)作为cnt,来自workstationevent的数据,其中serverdatetime> =:minDate和serverdatetime< :maxDate和userId = 1 group by data count(1)> :阈值

谢谢!

2 个答案:

答案 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]
    };

现在,结果将包含一系列包含属性CountData的匿名类型。或者你确实可以创建自己的摘要类型并以这种方式填充它。

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(*)时得到的。)

我以为我会指出这一点,以便将它们全部记录在一个地方。