CreateCriteria all'interno Expression.Disjunction () NHibernate fluente
-
19-09-2019 - |
Domanda
criteriaCount.CreateCriteria(AdvertisementsProperties.City.ToString())
.Add(Expression.Like(CitiesProperties.Name.ToString(), query, MatchMode.Anywhere))
.Add(Expression.Like(CitiesProperties.SlovenianName.ToString(), query, MatchMode.Anywhere))
.CreateCriteria(AdvertisementsProperties.Country.ToString())
.Add(Expression.Like(CountriesProperties.Name.ToString(), query, MatchMode.Anywhere))
.Add(Expression.Like(CountriesProperties.SlovenianName.ToString(), query, MatchMode.Anywhere));
Questo ritorno "come nome% pippo% e slovenianName come% pippo% e il nome come% pippo% e slovenianName come% pippo%"
ma vorrei ottenere "nome come% pippo% o slovenianName come% pippo% o il nome come% pippo% o slovenianName come% pippo%"
posso usare Expression.Disjunction () per OR ma ho problema che non posso usare createCriteria all'interno Expression.Disjunction (). Qualcuno può dirmi come posso usare OR e createCriteria insieme?
Saluti
Soluzione
Utilizzare CREATEALIAS fuori la disgiunzione ().
var result = session.CreateCriteria<Property>()
.CreateAlias("Cities", "city")
.CreateAlias("Countries", "country")
.Add(Restrictions.Disjunction()
.Add(Expression.Like("city.Name", query, MatchMode.Anywhere))
.Add(Expression.Like("city.SlovenianNam", query, MatchMode.Anywhere))
.Add(Expression.Like("country.Name", query, MatchMode.Anywhere))
.Add(Expression.Like("country.SlovenianNam", query, MatchMode.Anywhere))
).List();
I entités corrispondenti sono sotto. Speriamo che assomigliano tua.
class Property
{
public virtual Guid Id { get; set; }
public virtual IList<City> Cities { set; get; }
public virtual IList<Country> Countries { set; get; }
}
class City
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual string SlovenianNam{ get; set; }
}
class Country
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual string SlovenianNam{ get; set; }
}
Altri suggerimenti
Sopra esempio funziona bene perché entrambi classi othere sono le costituzioni di classe di proprietà.
Se è in questo ordine non funziona.
Classe di resistenza {
public int ID virtuale {get; impostato; }
publice string name virtuale {get; impostato;}
Pubblico virtuale Città città {get; set;} // molti a uno
}
class Città {
public int ID virtuale {get; impostato; }
pubblico virtuale string Nome {get; impostato; }
pubblico Paese Paese virtuale {get; impostato; } // molti a uno
}
class Paese {
public int ID virtuale {get; impostato; }
pubblico virtuale string Nome {get; impostato; }
}