2010-12-04 177 views
2

我怎樣才能做到這一點查詢與NHibernate我怎樣才能做到這一點查詢與NHibernate

select top 10 count(distinct classedition.createdby_id) as editions, class.id, 
     class.name, class.createdon, class.createdby_id 
from class 
inner join classedition on class.id = classedition.class_id 
group by class.id, class.name, class.createdon, class.createdby_id 
order by editions desc, class.createdon desc 

我使用NHibernate 3.我試過沒有成功的新LINQ提供程序去做。只要它產生上述確切的SQL查詢,我不在乎它的做法。如果可能的話,我寧願寫一個強類型的查詢,而不使用魔術字符串。

我是NHibernate的新手,所以這個問題可能很簡單。

這裏有一些更多的信息

我用流利的NHibernate與AutoMappings。 C#類非常簡單:

public class Class 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime CreatedOn { get; set; } 
} 

public class ClassEdition 
{ 
    public virtual int Id { get; set; } 
    public virtual Class Class { get; set; } 
    public virtual User CreatedBy { get; set; } 
} 

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

回答

0

HQL查詢是強類型和麪向對象的。

var results = session.CreateQuery(@" 
       select count(distinct e.CreatedBy), c.Id, 
        c.Name, c.CreatedOn, c.CreatedBy 
       from ClassEditions e 
       join e.Class c 
       group by c.Id, c.Name, c.CreatedOn, c.CreatedBy 
       order by 1 desc, c.CreatedOn desc 
       ") 
       .SetMaxResults(10) 
       .List(); 

您的C#代碼也是一個字符串。 NH還有一個查詢編譯器。

事實上,如果您將查詢放入映射文件中,您甚至可以通過安裝HQL Language Service for Visual Studio來獲得智能感知和實時錯誤檢查。

而一個簡單的單元測試只會構建SessionFactory,它會告訴你是否因爲更改而破壞了任何東西。更不用說現代重構工具(比如Resharper)能夠在字符串,綁定或任何類型的文件中重命名標識符而不會出現問題。

+1

這不是我所說的「強類型」,因爲它是一個普通的舊字符串。如果表「Class」被重命名,那麼沒有任何東西阻止應用程序編譯。但我認爲(還沒有嘗試過)它正在做我想做的事。在接受這個答案之前,我會等待一些可能的選擇。 – W3Max 2010-12-04 04:28:02

相關問題