2010-02-15 3 views
2

Est-il possible de joindre 3 ICriteria avec l'instruction OR pas ET?joindre 3 icriteria avec ou

ICriteria criteriaCity = NHibernateSession.CreateCriteria(typeof(Advertisements)) 
      .CreateCriteria(AdvertisementsProperties.City.ToString(), "city"). 
      Add(Restrictions.Or(
        Restrictions.Like("city." + CitiesProperties.Name.ToString(), text, MatchMode.Anywhere), 
        Restrictions.Like("city." + CitiesProperties.SlovenianName.ToString(), text, MatchMode.Anywhere))); 

     ICriteria criteriaArea = NHibernateSession.CreateCriteria(typeof(Advertisements)) 
      .CreateCriteria(AdvertisementsProperties.Area.ToString(), "area"). 
      Add(Restrictions.Or(
        Restrictions.Like("area." + AreasProperties.Name.ToString(), text, MatchMode.Anywhere), 
        Restrictions.Like("area." + AreasProperties.SlovenianName.ToString(), text, MatchMode.Anywhere))); 

     ICriteria criteriaCountry = NHibernateSession.CreateCriteria(typeof(Advertisements)) 
      .CreateCriteria(AdvertisementsProperties.Country.ToString(), "country"). 
       Add(Restrictions.Or(
         Restrictions.Like("country." + CountriesProperties.Name.ToString(), text, MatchMode.Anywhere), 
         Restrictions.Like("country." + CountriesProperties.SlovenianName.ToString(), text, MatchMode.Anywhere))); 

Cordialement


Si j'essaie comme ceci:

var criteria= NHibernateSession.CreateCriteria<Advertisements>(); 
criteria.CreateCriteria(AdvertisementsProperties.City.ToString(), "City"); 
criteria.CreateCriteria(AdvertisementsProperties.Area.ToString(), "Area"); 
criteria.CreateCriteria(AdvertisementsProperties.Country.ToString(), "Country"); 

     var dis = Restrictions.Disjunction(); 
     dis.Add(Restrictions.Like("City.Name", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("City.SlovenianName", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("Area.Name", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("Area.SlovenianName", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("Country.Name", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("Country.SlovenianName", text, MatchMode.Anywhere)); 
     criteria.Add(dis); 

Je ne suis jamais aucun résultat. J'utilise juste

var criteria = NHibernateSession.CreateCriteria(); criteria.CreateCriteria (AdvertisementsProperties.City.ToString(), "Ville"); criteria.CreateCriteria (AdvertisementsProperties.Country.ToString(), "Country");

var dis = Restrictions.Disjunction(); 
    dis.Add(Restrictions.Like("City.Name", text, MatchMode.Anywhere)); 
    dis.Add(Restrictions.Like("City.SlovenianName", text, MatchMode.Anywhere)); 
    dis.Add(Restrictions.Like("Country.Name", text, MatchMode.Anywhere)); 
    dis.Add(Restrictions.Like("Country.SlovenianName", text, MatchMode.Anywhere)); 
    criteria.Add(dis); 

puis fonctionne. Mais le nombre de rangées est différent alors

var criteria= NHibernateSession.CreateCriteria<Advertisements>(); 
    criteria.CreateCriteria(AdvertisementsProperties.Country.ToString(), "Country"); 

      var dis = Restrictions.Disjunction(); 
      dis.Add(Restrictions.Like("Country.Name", text, MatchMode.Anywhere)); 
      dis.Add(Restrictions.Like("Country.SlovenianName", text, MatchMode.Anywhere)); 
      criteria.Add(dis); 

Avez-vous une idée pourquoi? Je ne comprends pas ...

Cordialement

Répondre

1

Utilisez une restriction de Disjunction pour plusieurs ou des restrictions; inversement, utilisez Junction pour plusieurs ANDs. Je ne suis pas sûr à quoi servent les classes xProperties, mais cela devrait vous aider à démarrer:

var criteria = session.CreateCriteria<Advertisements>(); 
var dis = Restrictions.Disjunction(); 
dis.Add(Restrictions.Like("City.Name", text, MatchMode.Anywhere); 
dis.Add(Restrictions.Like("City.SlovenianName", text, MatchMode.Anywhere); 
dis.Add(Restrictions.Like("Area.Name", text, MatchMode.Anywhere); 
dis.Add(Restrictions.Like("Area.SlovenianName", text, MatchMode.Anywhere); 
dis.Add(Restrictions.Like("Country.Name", text, MatchMode.Anywhere); 
dis.Add(Restrictions.Like("Country.SlovenianName", text, MatchMode.Anywhere); 
criteria.Add(dis); 
return criteria.List<Advertisements>(); 
+1

Veuillez ne pas ajouter de nouvelles réponses; utilisez des commentaires ou modifiez votre question originale à la place. Comme je l'ai dit dans ma réponse, ce que vous faites avec "city" n'est pas clair pour moi. + CitiesProperties.Name.ToString() alors j'ai utilisé City.Name à la place. –