Frage

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

Diese Rückkehr "Namen wie% foo% und slovenianName wie% foo% und Namen wie% foo% und slovenianName wie% foo%"

, aber ich möchte "Namen wie% foo% oder slovenianName wie% foo% oder Namen wie% foo% oder slovenianName wie% foo%" erhalten

kann ich mit Expression.Disjunction () für OR, aber ich habe ein Problem, dass ich nicht CreateCriteria innerhalb Expression.Disjunction () verwenden kann. Kann mir jemand sagen, wie ich OR und CreateCriteria zusammen verwenden kann?

Viele Grüße

War es hilfreich?

Lösung

Verwenden Sie Create außerhalb der Disjunktion ().

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

Die entsprechenden Entities sind unten. Hoffentlich ähneln sie dir.

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

Andere Tipps

Im obigen Beispiel funktioniert gut, weil beide othere Klassen die Verfassungen der Festigkeitsklasse sind.

Wenn es in dieser Reihenfolge ist es nicht funktioniert.

Klasse Eigenschaft {      public virtual int Id {get; einstellen; }
     publice Name virtuellen String {get; einstellen;}      Öffentliche virtuelle Stadt Stadt {get; set;} // viele zu einer }

class Stadt {
   public virtual int Id {get; einstellen; }
   public virtual string Name {get; einstellen; }
   public virtual Land Land {get; einstellen; } // viele zu einer  }

Klasse Land {
   public virtual int Id {get; einstellen; }
   public virtual string Name {get; einstellen; }
}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top