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

这将返回 "name like %foo% and slovenianName like %foo% and name like %foo% and slovenianName like %foo%"

但我想得到“像%foo%或像%foo%这样的slovenianName或像%foo%或像%foo%这样的slovenianName这样的名字”

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

问候

4

2 回答 2

3

在 Disjunction() 之外使用 CreateAlias。

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; }
}
于 2010-02-11T12:26:04.743 回答
1

上面的例子效果很好,因为其他两个类都是 Property 类的构成。

如果按照这个顺序是行不通的。

class Property{ public virtual int Id { get; set; }
publice virtual string name { get; set;} Public virtual City city {get; set;} //many to one }

class City {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual country country { get; set; } //many to one }

class Country {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}

于 2011-05-04T11:38:59.370 回答