我有一个名为Class的类显示其中一个属性“Country”是对另一个表的引用。
显示课程
public class Show
{
public virtual int ID { get; set; }
public virtual Country CountryOrigin { get; set; }
public virtual string EnglishName { get; set; }
}
国家/地区
public class Country
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
}
我已全部映射并正常工作,但现在我想获得更具体的结果。我使用了标准api来获取所有数据并对其进行排序,但现在我只想根据国家/地区名称获取节目。这是我认为可行的,但显然不是。
public IList<Show> AllShowsByCountry(string countryName)
{
IList<Show> shows;
shows = _session.CreateCriteria(typeof(Show))
.Add(Restrictions.Eq("CountryOrigin.Name", "China" ))
.AddOrder(Order.Asc("EnglishName"))
.List<Show>();
return shows;
}
我认为限制的第一部分可能与HQL类似,您可以使用对象。
1)我想我的问题是我误解了HQL的工作原理或标准或两者兼而有之? 2)您还将如何使用标准正确地做到这一点?
更新 这是我得到的错误
could not resolve property: CountryOrigin.Name of: Entities.Show
答案 0 :(得分:4)
对于Criteria,请使用以下内容:
_session.CreateCriteria<Show>()
.CreateAlias("CountryOrigin", "country")
.Add(Restrictions.Eq("country.Name", countryName))
.AddOrder(Order.Asc("EnglishName"))
.List<Show>();
当然,当您不构建动态查询(搜索)时,HQL会更容易:
_session.CreateQuery(
@"
from Show
where CountryOrigin.Name = :countryName
order by EnglishName
")
.SetParameter("countryName", countryName)
.List<Show>();
Linq总是摇滚:
_session.Query<Show>()
.Where(s => s.CountryOrigin.Name = countryName)
.OrderBy(s => EnglishName)
.ToList();
(.Query
用于NH 3.x;用于2.x用于.Linq
)