2011-01-17 5 views
5

Ich habe einige Suche nach diesem und nichts ergab. Ist es möglich, eine Hibernate-Abfrage zu erstellen, um eine Gruppe von Objekten basierend auf einem Diskriminator zurückzugeben?Abfrage nach Diskriminator in NHibernate

Ich habe eine AbstractUser-Klasse, die um die konkreten Klassen UserTypeA und UserTypeB erweitert wird. Ich verwende das Tabelle-pro-Hierarchie-Modell, um meine Klassen in NHibernate zuzuordnen. Daher werden UserTypeA und UserTypeB in derselben Tabelle mit unterschiedlichen Diskriminatorwerten gespeichert. Hier ist meine Scheidungszuordnungseigenschaft:

<discriminator column="Type" type="string"/> 

ich eine Spalte in meinem Tisch haben, die den Namen des Benutzers Typ enthält. Ich frage mich, ob es möglich ist, eine NHibernate-Abfrage mit diesem auszuführen.

Ich versuchte dies:

public IList<DomainBase> FindByType(string typeName, Type type) 
{ 
    string query = "from " + type.Name + " k where k.Type = " + typeName; 
    return Session.CreateQuery(query).List<DomainBase>(); 
} 

Aber da Art nicht eigentlich eine Eigenschaft der Klasse ist, nur eine Spalte in der Tabelle, dies offensichtlich nicht funktioniert. Es erscheint überflüssig, sowohl eine Eigenschaft für diesen Zweck als auch einen Diskriminator zu haben, es sei denn, es gibt eine Möglichkeit, eine Eigenschaft als Diskriminator zu verwenden.

Antwort

6

Eigentlich ist dies auch bei http://www.nhibernate.info/doc/nh/en/index.html#queryhql-where dokumentiert:

Ebenso ist die spezielle Eigenschaft class greift auf den Unterscheidungswert eines Beispiel im Fall von polymorpher Ausdauer. Ein .Net-Klassenname , eingebettet in die Where-Klausel, wird in seinen Diskriminatorwert übersetzt.

from Eg.Cat cat where cat.class = Eg.DomesticCat 

können Sie auch eine System.Type Instanz als Parameter übergeben.

+0

Ist dies mit der Kriterien-API möglich? – joniba

+0

@joniba Ich glaube es ist. –

2

Wenn Sie wirklich nur von der Art abfragen möchten, dann denke ich, die ICriteria API ist eine bequemere Möglichkeit:

public IList<T> FindByType<T>() 
{ 
    return Session.CreateCriteria(typeof(T)).List<T>(); 
} 

Jetzt können Sie es wie IList<UserTypeB> list = FindByType<UserTypeB>() verwenden.