CreateCriteria dentro Expression.Disjunction () fluente nhibernate
-
19-09-2019 - |
Pergunta
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));
Esta "nome como% foo% e slovenianName como% foo% e nome como% foo% e slovenianName como% foo%" retorno
mas eu gostaria de ter "nome como% foo% ou slovenianName como% foo% ou nome como% foo% ou slovenianName como% foo%"
i pode usar Expression.Disjunction () para OR, mas eu tenho problema que eu não posso usar CreateCriteria dentro Expression.Disjunction (). Alguém pode me dizer como posso usar OR e CreateCriteria juntos?
Saudações
Solução
Use CreateAlias ??fora a disjunção ().
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();
Os entites correspondentes estão abaixo. Esperemos que eles se assemelham a sua.
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; }
}
Outras dicas
O exemplo acima funciona bem, porque ambas as classes othere são as constituições de classe propriedade.
Se é neste fim ele não funciona.
Propriedade classe {
public int Id virtual {get; conjunto; }
Publice nome cordas virtuais {get; conjunto;}
Público cidade cidade virtual {get; set;} // muitos para um
}
classe Cidade {
public int Id virtual {get; conjunto; }
cordas virtuais público Nome {get; conjunto; }
país país virtual público {get; conjunto; } // muitos para um
}
classe País {
public int Id virtual {get; conjunto; }
cordas virtuais público Nome {get; conjunto; }
}