Question

J'ai utilisé NHibernate fluide pour raccorder un magasin et une classe d'employés où les magasins peuvent avoir de nombreux employés comme suit:

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; }
}

J'ai besoin d'obtenir tous les magasins qui ont des employés qui n'ont pas Somestatus1 défini sur True.

Ma tentative fable ici a échoué:

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

Une idée de la façon dont je vais faire ça?

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

Ce que je ne sais pas, c'est comment obtenir NHibernate ne reçoivent que des magasins qui ont des employés dans l'état que je cherche ...

Je pense que ce que je veux demander à Nhibernate, c'est faire une jointure ... mais je ne sais pas comment le demander de le faire ...

Était-ce utile?

La solution

Vous vous joignez 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>();

Unité non testée espère que cela fonctionne, mais vous obtenez l'idée.C'est comme ça que 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 je ferai le chargement de la collection des employés.Le même code de base se trouve sur Blog de Ayende .Il y a un échantillon qui fait la même chose sans causer la recharge de la collection.Espère que cela aide.

Autres conseils

Essayez:

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

Je vous suggère d'utiliser la LINQ vers NHibernate API au lieu de l'API de critères.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 ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top