2010-07-21 5 views
3

Je l'ai utilisé Fluent NHibernate pour brancher une classe de magasin et employés où les magasins peuvent avoir de nombreux employés comme suit:Comment faire en sorte que NHibernate fasse une jointure?

public class Store 
{ 
    public virtual IList<Employee> Employees { get; set; } 
    //other store properties 
} 

public class Employee 
{ 
    public virtual Store Store { get; set; } 
    public virtual bool? SomeStatus1 { get; set; } 
} 

Je besoin d'obtenir tous les magasins qui ont des employés qui n'ont pas mis à SomeStatus1 vrai.

Mon Feable tentative a échoué ici:

Session.CreateCriteria(typeof(Store)) 
    .Add(Restrictions.Not(Restrictions.Eq("Employees.SomeStatus1", true)) 
    .List<Store>(); 

Toute idée de comment je vais à faire cela?

La raison pour laquelle ma tentative a échoué est que la liste Employés n'a pas de propriété de SomeStatus1 ... ce qui est assez évident.

Ce que je ne sais pas, comment obtenir NHibernate pour obtenir que les magasins qui ont des employés dans l'état où je suis à la recherche ...

Je pense que je suis désireux de demander NHibernate est de faire rejoindre ... mais je ne sais pas comment demander à faire ...

Répondre

4

vous joindre en créant des sous critères

var criteria = Session.CreateCriteria(typeof(Store)); 
var join = criteria.CreateCriteria("Employees"); 
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true)); 
return criteria.List<Store>(); 

Untested (OBV) espérons que cela fonctionne, mais vous voyez l'idée . Voilà comment je le fais avec N: 1 mais vous avez 1: N

EDIT: Ok, j'ai fait un peu de recherche après avoir posté. Il semble que le code que j'ai fait devrait fonctionner, mais entraînera le chargement de la collection des employés. Le même code de base se trouve sur ayende's blog. Il y a là un exemple qui fait la même chose sans que la collection soit rechargée. J'espère que cela pourra aider.

+0

Merci pour cela! ça a bien marché! ... bien que dans mon implémentation j'ai fait un .CreateAlias ​​("Employés") de sorte que l'instruction entière soit envoyée à la base de données comme une seule requête ... – mezoid

0

Je vous suggère d'utiliser l'API Linq to NHibernate au lieu de l'API Criteria. Avec elle, votre requête serait la suivante:

var query = Session.Linq<Store>() 
    .Where(store => store.SomeStatus1 != true); 

var result = query.ToList(); 

Plus d'aide here.

1

Essayez:

Session.CreateCriteria(typeof(Store)) 
.CreateAlias("Employees", "e") 
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true)) 
.List<Store>(); 
Questions connexes