2010-06-25 46 views
1

我有一个名为Show的属性“Country”是对另一个表的引用。使用NHibernate Criteria API从引用对象获取特定结果的问题

显示类

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

你会得到任何错误? – 2010-06-25 02:20:50

+0

这可能会有用。我用它更新了这篇文章。 – percent20 2010-06-25 02:25:38

回答

4

为标准,使用错误如下:

_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

+1

真棒谢谢你。我将不得不阅读CreateAlias。 – percent20 2010-06-25 02:38:12

相关问题