Domanda

Ho usato fluente NHibernate per collegare un negozio e una classe di dipendenti in cui i negozi possono avere molti dipendenti come segue:

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

Ho bisogno di ottenere tutti i negozi che hanno dipendenti che non hanno il somestatus1 impostato su TRUE.

Il mio sforzo preferito qui ha fallito:

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

Qualche idea come vado a farlo?

La ragione per cui il mio tentativo è fallito è perché i dipendenti dell'elenco non hanno una proprietà di Somestatus1 ... che è abbastanza ovvio.

Quello che non so, è come ottenere nibernati per ottenere solo negozi che hanno dipendenti nello stato sto cercando ...

Penso che cosa voglio chiedere Nibernate è fare un unione ... ma non so come chiederlo di farlo ...

È stato utile?

Soluzione

Ti unisci creando i sub criteri

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

Non testato (OVV) Spero che funzioni, ma hai l'idea.Ecco come lo faccio con N: 1 Ma hai 1: N

Modifica: OK, ho fatto un po 'di ricerca dopo la pubblicazione.Sembra che il codice che ho fatto dovrebbe funzionare, ma causerà il caricamento della collezione dei dipendenti.Lo stesso codice di base è trovato su Blog di Ayende .C'è un campione che fa la stessa cosa senza che la raccolta venga ricaricata.Spero che ti aiuti.

Altri suggerimenti

Prova:

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

Ti suggerirei di utilizzare la LINQ per API NHibernate invece del criterio API.Con esso, la tua query sarebbe la seguente:

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

var result = query.ToList();
.

Altro Aiuto qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top