Expression.Disjunction()里面的CreateCriteria流畅的nhibernate

时间:2010-02-08 19:56:37

标签: nhibernate createcriteria

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

此返回“名称如%foo%和斯洛文尼亚名称,如%foo%和名称,如%foo%和斯洛文尼亚名称,如%foo%”

但我希望得到“像%foo%或slovenianName的名称,如%foo%或名称,如%foo%或slovenianName,如%foo%”

我可以使用Expression.Disjunction()进行OR,但我有问题,我不能在Expression.Disjunction()中使用CreateCriteria。有人能告诉我如何一起使用OR和CreateCriteria?

此致

2 个答案:

答案 0 :(得分:3)

在Disjunction()之外使用Create Alias。

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

相应的实体如下。希望它们与你的相似。

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 :(得分:1)

上面的示例很有效,因为其他类都是Property类的构成。

如果它按此顺序,则不起作用。

class Property {      public virtual int Id {get;组; }
     publice虚拟字符串名称{get;组;}      公共虚拟城市城市{get; set;} //多对一 }

班级城市{
   public virtual int Id {get;组; }
   public virtual string Name {get;组; }
   公共虚拟国家{get;组; } //多对一  }

类国家{
   public virtual int Id {get;组; }
   public virtual string Name {get;组; }
}