2010-02-08 3 views
1
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%"createCriteria intérieur Expression.Disjunction() de Fluent NHibernate

mais je voudrais obtenir "nom comme% foo% ou slovenianName comme% foo% ou nom comme% foo% ou slovenianName comme% foo%"

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

salutations

+0

Vous devez nous fournir davantage d'informations. Montre-nous tes entités. –

Répondre

3

Utilisation createAlias ​​en dehors de la disjonction().

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 entites correspondantes sont indiquées 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; } 
} 
1

L'exemple ci-dessus fonctionne bien car les deux autres classes sont les constitutions de la classe Property.

Si c'est dans cet ordre, cela ne fonctionne pas.

class Propriété { public virtual int Id {get; ensemble; }
publice nom de la chaîne virtuelle {get; set;} Public virtual Ville de la ville {get; set;} // nombre à un }

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

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