2008-11-21 26 views
2

我想弄清楚如何用Castle ActiveRecord執行自定義查詢。用Castle ActiveRecord自定義查詢

我能夠運行,返回我的實體簡單的查詢,但我真正需要的是像下面的查詢(含自定義字段集):

SELECT COUNT(1)CNT,從workstationevent數據其中serverdatetime> =:minDate和serverdatetime <:maxDate和userId = 1按數據計數(1)>閾值:閾值

謝謝!

回答

6

在這種情況下,你想要的是HqlBasedQuery。你的查詢將是一個投影,所以你將返回的元組包含結果(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一樣返回實際映射的屬性而不是集合或函數。

+0

謝謝!今晚我會試試看! – Slav 2008-12-12 09:54:30

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語句中使用計數(1)可以將查詢返回的,而不是在Object []一個ArrayList字符串的ArrayList(這是您使用count(*)時,你得到了什麼。)

只是想我會指出這是爲了將它全部記錄在一個地方。