Interrogazione oggetto aggregato in NHibernate / Sospensione
-
09-10-2019 - |
Domanda
Ho un modello di dominio per i paesi e gli Stati che appare come il seguente (vedi sotto).
Voglio (con l'API Crieteria o HQL) prendere tutti gli Stati per un paese specifico. Ricevo come parametro il CountryCode.
Da quello che ho capito in NHibernate, devo caricare il paese e quindi emettere la chiamata al mio secondo repository con il "Paese oggetto" per essere in grado di fare un Expression.Eq () nel mio crieria. C'è un modo per andare a prendere tutti gli Stati per una specifica Paese e, quindi, utilizzare una singola query? Voglio solo fare un semplice SQL join interno e quindi aggiungere un vincolo sul codice del paese.
Sono sicuro che ha qualcosa a che fare con le proiezioni, ma gli unici esempi che ho trovato sono per un unico modello e mostrare come utilizzare aggreate funzione che non è quello che intendo fare.
La ringrazio molto per il vostro aiuto!
Il mio attuale aspetto di chiamata repository come questo:
public IList<Model.StateProvinces> LoadStateProvincesForAutocomplete(string partialName, string countryCode)
{
CountryRepository countryRepo = new CountryRepository();
Model.Country currentCountry = countryRepo.Get(countryCode);
return
_session.CreateCriteria<Model.StateProvince>()
.Add(Expression.Eq("Country", currentCountry))
.Add(Expression.Like("Name", partialName, MatchMode.Anywhere))
.List<Model.StateProvince>();
}
E i miei modelli sono definiti come segue:
public class Country
{
public virtual int Id { get; set; }
public virtual string Code { get; set; }
public virtual string NameEn { get; set; }
public virtual string NameFr { get; set; }
public virtual List<Model.StateProvince> StateProvinces { get; set; }
}
public class StateProvince
{
public virtual Country Country { get; set; }
public virtual int Id { get; set; }
public virtual string Code { get; set; }
public virtual string NameEn { get; set; }
public virtual string NameFr { get; set; }
}
Soluzione
dovrebbe essere abbastanza semplice se si utilizzano le estensioni lambda per ICriteria:
session.CreateCriteria<StateProvince>().Add(s=>s.Country.NameEn == "United States").List();
Questo dovrebbe aggiungere il corretto aderire e vincolo di equidistanza, a patto che il rapporto dei due entità sia correttamente mappato nei vostri HBMS.
Inoltre, provare Linq2NH con lo spazio dei nomi NHibernate.Linq:
session.Linq<StateProvince>().Where(s=>s.Country.NameEn == "United States").ToList();
Sono la creazione di Linq interroga mentre leggete questo che vanno un paio di strati più profondi; senza sudore a tutti.