2010-06-25 65 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