Ну, это было задано давно, но у меня есть рабочий ответ.
public static IList<T> ExecuteQuery<T>(HqlBasedQuery query)
where T : new()
{
query.SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(T)));
var results = (ArrayList)ActiveRecordMediator.ExecuteQuery(query);
List<T> list = new List<T>(results.Count);
for (int i = 0; i < results.Count; i++)
{
list.Add((T)results[i]);
}
return list;
}
Это вернет вам результаты типа T. Тип T может быть что угодно вы хотите. Типу T не нужен конструктор аргументов, и ему нужны открытые поля или свойства, которые соответствуют именам или псевдонимам столбцов в создаваемом запросе.
Мы делаем это постоянно. Особенно, если вы хотите использовать агрегатную функцию в HQL для получения агрегированных данных.
Сопутствующая функция позволит вам просто передать ваш запрос в виде строки, а также любые позиционные параметры, которые у вас могут быть:
public static IList<T> ExecuteQuery<T, U>(string hqlQuery, params object[] parameters)
where T : new()
{
return ExecuteQuery<T>(new HqlBasedQuery(typeof(U), hqlQuery, parameters));
}
Тип U - это любой тип, который является допустимым типом ActiveRecord. Это даже не тот тип, на который вы ссылаетесь. Если вы хотите заменить его, то какой-то тип, который, как вы знаете, будет действительным в сеансе, и исключит дополнительный параметр.