2012-07-27 60 views
2

我有一個使用NHibernate和C#語言的應用程序。我有一個與一些關係的模型,我想創建一個查詢來獲得只有一個值。我試過這樣的事情:用NHibernate查詢獲取特定列

public long GetIdCompany(long number) 
{ 
    return session.QueryOver<Report>() 
        .Where(x => x.Number == number) 
        .Select(x => x.Equipament.Company.Id) 
        .Take(1); 
} 

但我沒有工作。我只想在模型Report.Equipament.Company.Id中使用IdCompany。這可能是在queryover,LINQ,HQL,等...

+0

作爲一個方面,你很可能縮短這'。凡(X => x.Number ==號碼).Single()。[Id道具]' – SpaceBison 2012-07-27 12:58:52

+0

什麼不起作用?你能告訴我們一個錯誤消息嗎? – mathieu 2012-07-27 13:05:56

回答

6

你應該使用JoinAlias,所以你的請求將看起來像

public long GetIdCompany(long number) 
    { 
     Equipament equipamentAlias = null; 
     return session.QueryOver<Report>() 
         .Where(x => x.Number == number) 
         .JoinAlias(x => x.Equipament,() => equipamentAlias) 
         .Select(x => equipamentAlias.Company.Id) 
         .SingleOrDefault<long>(); 
    } 

這裏是excellent introduction to QueryOver

+0

感謝GSerjo,您的解決方案適用於我:) – 2012-07-29 19:50:18

7

HQL

return session.CreateQuery(
     "select e.Company.id from Report r " + 
     " inner join r.Equipament e " + 
     "where r.Number = :number") 
    .SetInt64("number", number) 
    .UniqueResult<long>(); 

LINQ

return session.Query<Report>() 
    .Where(x => x.Number == number) 
    .Select(x => x.Equipament.Company.Id) 
    .Single(); 

QueryOver

見GSerjo的answer

+0

QueryOver不起作用,需要加入 – GSerjo 2012-07-27 21:25:56

+1

@GSerjo謝謝。指出你的答案。 – 2012-07-27 21:32:30

+0

謝謝Miroslav,我喜歡你的awser,但我想用QueryOver。 – 2012-07-29 19:50:05