CreateCriteria dans Expression.Disjunction() nhibernate couramment
-
19-09-2019 - |
Question
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));
Ce retour "nom comme %foo% et slovenianName comme %foo% et nom comme %foo% et slovenianName comme %foo%"
mais j'aimerais obtenir "un nom comme %foo% ou slovenianName comme %foo% ou un nom comme %foo% ou slovenianName comme %foo%"
je peux utiliser Expression.Disjunction() pour OR mais j'ai un problème car je ne peux pas utiliser CreateCriteria dans Expression.Disjunction().Quelqu'un peut-il me dire comment utiliser OR et CreateCriteria ensemble ?
Salutations
La solution
Utilisez CreateAlias en dehors de Disjunction().
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();
Les entités correspondantes sont ci-dessous.J'espère qu'ils ressemblent aux vôtres.
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; }
}
Autres conseils
exemple ci-dessus fonctionne bien parce que les deux sont des classes othere les constitutions de la classe de propriété.
S'il est dans cet ordre, il ne fonctionne pas.
{class propriété
int virtuel public Id {get; ensemble; }
publice nom de chaîne virtuelle {get; ensemble;}
ville de la ville virtuelle publique {get; ensemble;} // plusieurs à un
}
Ville de classe {
int virtuel public Id {get; ensemble; }
Nom de chaîne publique virtuelle {get; ensemble; }
pays pays virtuel public {get; ensemble; } // plusieurs à un
}
Pays de classe {
int virtuel public Id {get; ensemble; }
Nom de chaîne publique virtuelle {get; ensemble; }
}