Domanda

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

Questo ritorno "come nome% pippo% e slovenianName come% pippo% e il nome come% pippo% e slovenianName come% pippo%"

ma vorrei ottenere "nome come% pippo% o slovenianName come% pippo% o il nome come% pippo% o slovenianName come% pippo%"

posso usare Expression.Disjunction () per OR ma ho problema che non posso usare createCriteria all'interno Expression.Disjunction (). Qualcuno può dirmi come posso usare OR e createCriteria insieme?

Saluti

È stato utile?

Soluzione

Utilizzare CREATEALIAS fuori la disgiunzione ().

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

I entités corrispondenti sono sotto. Speriamo che assomigliano tua.

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

Altri suggerimenti

Sopra esempio funziona bene perché entrambi classi othere sono le costituzioni di classe di proprietà.

Se è in questo ordine non funziona.

Classe di resistenza {      public int ID virtuale {get; impostato; }
     publice string name virtuale {get; impostato;}      Pubblico virtuale Città città {get; set;} // molti a uno }

class Città {
   public int ID virtuale {get; impostato; }
   pubblico virtuale string Nome {get; impostato; }
   pubblico Paese Paese virtuale {get; impostato; } // molti a uno  }

class Paese {
   public int ID virtuale {get; impostato; }
   pubblico virtuale string Nome {get; impostato; }
}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top