Создайте критерии внутри выражения.Функция Disjunction() свободно использует nhibernate
-
19-09-2019 - |
Вопрос
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));
Это возвращает "имя, подобное %foo%, и словенское имя, подобное %foo%, и имя, подобное %foo%, и словенское имя, подобное %foo%".
но я хотел бы получить "name like %foo% или slovenianName like %foo% или name like %foo% или slovenianName like %foo%"
я могу использовать Expression.Disjunction() для ИЛИ, но у меня проблема в том, что я не могу использовать createCriteria внутри Expression.Disjunction().Кто-нибудь может сказать мне, как я могу использовать OR и createCriteria вместе?
С уважением
Решение
Используйте createAlias вне дизъюнкции().
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();
Соответствующие объекты приведены ниже.Надеюсь, они похожи на ваши.
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; }
}
Другие советы
Приведенный выше пример работает хорошо, потому что оба других класса являются конституциями класса Property.
Если в таком порядке, то это не работает.
Свойство класса {public virtual int id {get;набор;}
имя публичной виртуальной строки {get;set;} public Virtual City City {get;set;} // много к одному}
класс Город {
общественный виртуальный int Id {get;набор;}
общедоступная виртуальная строка Имя {get;набор;}
публичная виртуальная страна страна {получить;набор;} // много к одному}
класс Страна {
общественный виртуальный int Id {get;набор;}
общедоступная виртуальная строка Имя {get;набор;}
}