Come faccio a fare NHibernate a fare un join?
-
18-09-2020 - |
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 ...
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 .