2008-11-21 2 views
2

Я пытаюсь выяснить, как выполнить пользовательский запрос с помощью Castle ActiveRecord.Пользовательский запрос с замком ActiveRecord

я смог запустить простой запрос, который возвращает мою сущность, но то, что мне действительно нужно запрос как это ниже (с набором настраиваемых полей):

SELECT COUNT (1) в качестве НКТ, данные workstationevent где serverdatetime> =: minDate и serverdatetime <: maxDate и userId = 1 по данным, имеющим счет (1)>: порог

Спасибо!

ответ

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.

+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); 

и он должен работать.

Также обратите внимание, что при использовании счета (1) в вашем HQL заявление сделает запрос возвращает ArrayList из строки вместо ArrayList объекта [] (который является то, что вы получаете при использовании COUNT (*).)

Просто подумал, что я хотел бы указать на это ради того, чтобы все это было задокументировано в одном месте.

Смежные вопросы