Truncar DateTime en NHibernate QueryOver SelectGroup
group-by truncate (2)
Tengo una consulta QueryOver bastante ordinaria que contiene lo siguiente,
.SelectList(list => list
.SelectGroup(() => txn.GroupField)
.SelectGroup(() => txn.Date))
.List<object[]>()
Esta consulta funciona como se esperaba, sin embargo ahora tengo un requisito para agrupar por la fecha truncada, ya que algunas de las fechas para estos objetos pueden contener un componente de tiempo. Parece que debería ser un cambio trivial, pero no puedo encontrar una manera que sea compatible con NHibernate.
La solución obvia sería el cambio a continuación, pero no es compatible.
.SelectGroup(() => txn.Date.Date))
¿Algunas ideas?
Gracias
Su QueryOver
podría verse así:
Status alias = null;
var query = QueryOver.Of(() => alias)
.Select(Projections.GroupProperty(
Projections.SqlFunction("date", NHibernateUtil.Date, Projections.Property(() => alias.Date))));
Salida (pseudo sql):
SELECT
...
FROM [Status] this_
GROUP BY dateadd(dd, 0, datediff(dd, 0, this_.Date))
Espero que esto ayude, ¡salud!
Es posible que desee agregar una propiedad auxiliar a su mapa, utilizando el comando Fórmula, para poder usar la fecha (en lugar de la fecha y hora) en las consultas.
aquí hay un ejemplo de mi código; usa un valor decimal, pero esto funciona bien con cualquier subconsulta:
la clase modelo tiene esta propiedad, que se asignará a una fórmula:
public virtual decimal Profit
{
get { return this.SellPrice - this.Cost; }
set { return; }
}
mapa fluentNHibernate:
//SellPrice and Cost are columns in the object''s table
Map(v => v.Profit).Formula("(SellPrice - Cost)"); // this field is calculated, not read
asegúrese de poner la fórmula entre () corchetes sin embargo.
Si convierte su fórmula en una consulta de selección que enlaza la fecha y hora en una fecha, puede agrupar esa propiedad en su consulta.