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; }
 }
È stato utile?

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.

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