2009-11-06 12 views
1

J'ai une classe client comme ça:NHibernate Recherche avec l'héritage

public class Client 
{ 
    public Person Pers { get; set; } 
} 

Et je 2 Person's classe enfant:

public class PersonType1 : Person 
{ 
    protected string att1; 
    protected string att2; 
} 

public class PersonType2 : Person 
{ 
    protected string att3; 
    protected string att4; 
} 

public class Person 
{ 
    protected string attx; 
    protected string atty; 
} 

Ainsi, mon client pourrait être PersonType1 ou PersonType2 .. .

Je dois exécuter une recherche client ... Les paramètres à cette recherche sont att1, att2, att3, ATT4, ATTx, atty ... Mais tous ceux qui sont en option ...

J'essaie d'exécuter cette recherche avec ICriteria, mais je ne sais pas comment spécifier ce schéma d'héritage ...

Répondre

1

Vous ne pouvez vraiment pas faire cela car au niveau des critères, la classe Person est indépendante de toutes les classes dérivées. Le jeu de résultats sera un IList<Person> même si iterating à travers la collection vous montrera que les éléments comprendront également des types PersonType1 et PersonType2 (supposons que nous venons de récupérer l'ensemble entier de la base de données sans aucune restriction).

Cela dit, vous pouvez obtenir l'effet désiré avec une solution de contournement: définir chaque type dérivé comme une nouvelle sous-requête

var dc1 = DetachedCriteria.For(typeof(PersonType1)).SetProjection(Projections.Property("id")).Add(Expression.Eq("att1", "foo")); 

var dc2 = DetachedCriteria.For(typeof(PersonType2)).SetProjection(Projections.Property("id")).Add(Expression.Eq("att3", "bar")); 

pour les types dérivés N et puis juste sur votre principale requête de critères ne

CreateCriteria(typeof(Person)).Add(Subqueries.PropertyIn("Id", dc1) || Subqueries.PropertyIn("Id", dc2)); 

Sinon, une ISQLQuery n'a pas de telles limitations.

EDIT J'ajoute ci-dessous les ajustements nécessaires pour trouver le client je vais re-écrire les critères à un <Client> critères et exprimer la restriction sur la sous-requête <Person>s rejoint.

var crit = ses.CreateCriteria(typeof(Client)).CreateCriteria("Person","per").Add(Subqueries.PropertyIn("per.Id", dc1) || Subqueries.PropertyIn("per.Id", dc2)); 
+0

Merci Jaguar ... je ne ai jamais utiliser DetachedCriteria, donc je suis un peu perdu ... je ne suis pas essayer de chercher personne, mais les clients qui ont déterminé la personne ... peut tu me montres comment faire ça? Merci – Paul