8 Stimmen

Kürzen Sie DateTime in NHibernate QueryOver SelectGroup

Ich habe eine ziemlich Standard-QueryOver-Abfrage, die Folgendes enthält,

.SelectList(list => list
    .SelectGroup(() => txn.GroupField)
    .SelectGroup(() => txn.Date))
.List()

Diese Abfrage funktioniert wie erwartet, aber jetzt habe ich eine Anforderung, nach dem abgeschnittenen Datum zu gruppieren, da einige der Daten dieser Objekte einen Zeitkomponente enthalten können. Dies scheint wie eine triviale Änderung zu sein, aber ich kann keine Möglichkeit finden, die von NHibernate unterstützt wird.

Die naheliegende Lösung wäre die folgende Änderung, aber sie wird nicht unterstützt.

.SelectGroup(() => txn.Date.Date))

Irgendwelche Ideen?

Danke

6voto

MonkeyCoder Punkte 2580

Ihr QueryOver könnte so aussehen:

Status alias = null;
var query = QueryOver.Of(() => alias)
    .Select(Projections.GroupProperty(
        Projections.SqlFunction("date", NHibernateUtil.Date, Projections.Property(() => alias.Date))));

Ausgabe (Pseudo-SQL):

SELECT 
           ...
FROM       [Status] this_
GROUP BY   dateadd(dd, 0, datediff(dd, 0, this_.Date))

Hoffentlich hilft Ihnen das weiter, Prost!

0voto

increddibelly Punkte 1076

Sie möchten möglicherweise eine Hilfseigenschaft zu Ihrer Karte hinzufügen, indem Sie den Formelbefehl verwenden, um das Datum (anstelle von Datetime) in Abfragen verwenden zu können.

Hier ist ein Beispiel aus meinem Code; es verwendet einen Dezimalwert, aber dies funktioniert auch mit jeder Unterabfrage:

Das Model-Klasse hat diese Eigenschaft, die einer Formel zugeordnet werden soll:

public virtual decimal Profit
{
    get { return this.SellPrice - this.Cost; }
    set { return; }
}

FluentNHibernate-Karte:

//SellPrice und Cost sind Spalten in der Tabelle des Objekts
Map(v => v.Profit).Formula("(SellPrice - Cost)"); // dieses Feld wird berechnet, nicht gelesen

Stellen Sie jedoch sicher, dass Sie die Formel zwischen () Klammern setzen.

Wenn Sie Ihre Formel zu einer Select-Abfrage machen, die den DateTime auf ein Datum trimmt, könnten Sie dann nach dieser Eigenschaft in Ihrer Abfrage gruppieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X