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

Foi útil?

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; }
}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top