Pregunta

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

Esto devuelve "nombre como %foo% y slovenianName como %foo% y nombre como %foo% y slovenianName como %foo%"

pero me gustaría obtener "nombre como %foo% o nombre esloveno como %foo% o nombre como %foo% o nombre esloveno como %foo%"

Puedo usar Expression.Disjunction() para OR pero tengo el problema de que no puedo usar CreateCriteria dentro de Expression.Disjunction().¿Alguien puede decirme cómo puedo usar OR y CreateCriteria juntos?

Saludos

¿Fue útil?

Solución

Utilice CreateAlias ​​fuera de la disyunción().

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();

Las entidades correspondientes se encuentran a continuación.Ojalá se parezcan a los tuyos.

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

Otros consejos

El ejemplo de arriba funciona bien porque las dos clases othere son las constituciones de la clase de propiedades.

Si es en este orden no funciona.

Propiedad de la clase {      public int Id virtuales {get; conjunto; }
     Publice nombre de cadena virtuales {get; conjunto;}      Pública de la ciudad ciudad virtual {get; set;} // muchos a uno }

Ciudad clase {
   public int Id virtuales {get; conjunto; }
   pública Virtual String Nombre {get; conjunto; }
   país país virtual pública {get; conjunto; } // muchos a uno  }

País clase {
   public int Id virtuales {get; conjunto; }
   pública Virtual String Nombre {get; conjunto; }
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top