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?
此致
答案 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;组; }
}