Question

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

Ce retour "nom comme %foo% et slovenianName comme %foo% et nom comme %foo% et slovenianName comme %foo%"

mais j'aimerais obtenir "un nom comme %foo% ou slovenianName comme %foo% ou un nom comme %foo% ou slovenianName comme %foo%"

je peux utiliser Expression.Disjunction() pour OR mais j'ai un problème car je ne peux pas utiliser CreateCriteria dans Expression.Disjunction().Quelqu'un peut-il me dire comment utiliser OR et CreateCriteria ensemble ?

Salutations

Était-ce utile?

La solution

Utilisez CreateAlias ​​en dehors de Disjunction().

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

Les entités correspondantes sont ci-dessous.J'espère qu'ils ressemblent aux vôtres.

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

Autres conseils

exemple ci-dessus fonctionne bien parce que les deux sont des classes othere les constitutions de la classe de propriété.

S'il est dans cet ordre, il ne fonctionne pas.

{class propriété      int virtuel public Id {get; ensemble; }
     publice nom de chaîne virtuelle {get; ensemble;}      ville de la ville virtuelle publique {get; ensemble;} // plusieurs à un }

Ville de classe {
   int virtuel public Id {get; ensemble; }
   Nom de chaîne publique virtuelle {get; ensemble; }
   pays pays virtuel public {get; ensemble; } // plusieurs à un  }

Pays de classe {
   int virtuel public Id {get; ensemble; }
   Nom de chaîne publique virtuelle {get; ensemble; }
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top