代码之家  ›  专栏  ›  技术社区  ›  Buddy Lindsey

使用NHibernate标准API从引用对象获取特定结果时出现问题

  •  1
  • Buddy Lindsey  · 技术社区  · 14 年前

    显示类

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

    我已经绘制了所有的地图并在工作,但现在我想得到更具体的结果。我已经使用criteriaapi来获取所有数据并对其进行排序,但现在我只想根据国家名称获取节目。这是我认为可行的,但显然不行。

    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
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Diego Mijelshon    14 年前

    对于标准,请使用以下内容:

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

    _session.Query<Show>()
            .Where(s => s.CountryOrigin.Name = countryName)
            .OrderBy(s => EnglishName)
            .ToList();
    

    ( .Query .Linq )