Создайте критерии внутри выражения.Функция Disjunction() свободно использует nhibernate

StackOverflow https://stackoverflow.com/questions/2224448

  •  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;набор;}
}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top