windsor - Consulta personalizada con Castle ActiveRecord
castle windsor (2)
Sin embargo, tenga en cuenta que si usa ActiveRecord 1.0.3 (RC3) como yo lo hice, esto dará como resultado un tiempo de ejecución InvalidCastException. ActiveRecordMediator.ExecuteQuery devuelve una ArrayList y no una ICollection genérica. Entonces, para que funcione, simplemente cambie esta línea:
var results = (ICollection<object[]>) ActiveRecordMediator.ExecuteQuery(query);
a
var results = (ArrayList) ActiveRecordMediator.ExecuteQuery(query);
y debería funcionar
También tenga en cuenta que el uso del recuento (1) en su declaración hql hará que la consulta devuelva ArrayList of String en lugar de ArrayList of object [] (que es lo que obtiene al usar count (*)).
Solo pensé en señalar esto por el bien de tener todo documentado en un solo lugar.
Estoy tratando de averiguar cómo ejecutar una consulta personalizada con Castle ActiveRecord.
Pude ejecutar una consulta simple que devuelve mi entidad, pero lo que realmente necesito es la siguiente consulta (con un conjunto de campos personalizados):
seleccione count (1) como cnt, datos de workstationevent donde serverdatetime> =: minDate y serverdatetime <: maxDate y userId = 1 group por datos que tienen count (1)>: threshold
¡Gracias!
En este caso, lo que quiere es HqlBasedQuery
. Su consulta será una proyección, entonces lo que obtendrá será una ArrayList
de tuplas que contienen los resultados (el contenido de cada elemento de ArrayList dependerá de la consulta, pero para más de un valor será 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
}
Puede crear un tipo anónimo para mantener los resultados de una manera más significativa. Por ejemplo:
var results = from summary in
(ArrayList)ActiveRecordMediator.ExecuteQuery(query)
select new {
Count = (int)summary[0], Data = (string)summary[1]
};
Ahora los resultados contendrán una colección de tipos anónimos con propiedades Count
and Data
. O bien, podría crear su propio tipo de resumen y completarlo de esta manera también.
ActiveRecord también tiene ProjectionQuery
que hace más o menos lo mismo, pero solo puede devolver las propiedades reales mapeadas en lugar de agregados o funciones como lo hace con HQL.