Пользовательский запрос с замком ActiveRecord - PullRequest
2 голосов
/ 21 ноября 2008

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

Мне удалось выполнить простой запрос, который возвращает мою сущность, но мне действительно нужен следующий запрос (с установленным настраиваемым полем):

выберите count (1) в качестве cnt, данные из события рабочей станции, где serverdatetime> =: minDate и serverdatetime <: maxDate и userId = 1, по данным с количеством (1)>: порог

Спасибо!

Ответы [ 2 ]

6 голосов
/ 25 ноября 2008

В этом случае вы хотите 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 голосов
/ 08 мая 2009

Имейте в виду, что если вы используете ActiveRecord 1.0.3 (RC3), как я, это приведет к исключению InvalidCastException во время выполнения. ActiveRecordMediator.ExecuteQuery возвращает ArrayList, а не универсальную коллекцию ICollection. Поэтому, чтобы заставить его работать, просто измените эту строку:

var results = (ICollection<object[]>) ActiveRecordMediator.ExecuteQuery(query);

до

var results = (ArrayList) ActiveRecordMediator.ExecuteQuery(query);

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

Также обратите внимание, что использование count (1) в вашем выражении hql заставит запрос возвращать ArrayList из String вместо ArrayList объекта [] (это то, что вы получаете при использовании count (*).)

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

...