4 Stimmen

Hilfe zur NHibernate-Projektion

Ich habe ein Problem bei der Erstellung einer Projektion für meine nhibernate detachedcriteria Objekt.

Ich habe eine Klasse Spa, die mit der Tabelle Adresse verknüpft ist.

Adresse hat ein Feld namens Stadt, das eine Zeichenkette ist.

public class Spa : IAggregateRoot
{
       [BelongsTo("AddressID", Cascade = CascadeEnum.All)]
       public Address Address { get; set; }
}

Mein Ziel ist es, eine eindeutige Liste von Städtenamen zu erhalten.

Wenn ich alle Spas mit unterschiedlichen Städten bekommen könnte, wäre ich auch glücklich.

Alle meine Versuche waren vergeblich, und ich habe keine hilfreichen Beiträge gefunden.

Bis jetzt habe ich es versucht:

DetachedCriteria query = DetachedCriteria.For<Spa>()
                         .CreateAlias("Address", "A")

query.SetProjection(
         Projections.Distinct(Projections.ProjectionList()
         .Add(Projections.Alias(Projections.Property("Address"), "A"))));

var Spas = ActiveRecordMediator<Spa>.FindAll(query);

Ich weiß, dass das oben Gesagte nicht korrekt ist, ich versuche nur, einen Anfang zu finden.

Für jede Hilfe wären wir dankbar. Auch jede einfache Projektionen Tutorials würde geschätzt werden, kippe scheinen, etwas geradeaus da draußen zu finden.

Ich habe es auch versucht, aber ich habe einen Besetzungsfehler bekommen, den ich überprüfen will:

DetachedCriteria query = DetachedCriteria.For<Spa>() 
.CreateAlias("Address", "A")
.SetProjection(Projections.Distinct(Projections.Property("A.City")));

2voto

Daniel Schilling Punkte 4800

Ich habe den Eindruck, dass Ihre Frage aus zwei Teilen besteht.

1. Wie sollen meine DetachedCriteria aussehen?

Wenn Sie keine anderen Aggregationen durchführen, GROUP BY sollte die gleichen Ergebnisse liefern wie DISTINCT . Dies ist die Abfrage, die ich verwenden würde:

var query = DetachedCriteria.For<Spa>()
    .CreateAlias("Address", "A")
    .SetProjection(Projections.GroupProperty("A.City"));

2. Wie führe ich es mit Castle ActiveRecord aus?

Ich habe nie ActiveRecord verwendet, aber basierend auf den Methodensignaturen, würde ich erwarten, dass so etwas wie dieses zu arbeiten:

var cities = ActiveRecordMediator<string>.FindAll(query);

Wenn Sie Zugriff auf die NHibernate-Sitzung haben, können Sie sie auch auf diese Weise ausführen:

var cities = query.GetExecutableCriteria(session).List<string>();

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